1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.zookeeper;
21
22 import java.util.List;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.hbase.Abortable;
27 import org.apache.hadoop.hbase.HServerAddress;
28 import org.apache.hadoop.hbase.HServerInfo;
29 import org.apache.hadoop.hbase.master.ServerManager;
30 import org.apache.zookeeper.KeeperException;
31
32
33
34
35
36
37
38
39
40
41
42 public class RegionServerTracker extends ZooKeeperListener {
43 private static final Log LOG = LogFactory.getLog(RegionServerTracker.class);
44
45 private ServerManager serverManager;
46 private Abortable abortable;
47
48 public RegionServerTracker(ZooKeeperWatcher watcher,
49 Abortable abortable, ServerManager serverManager) {
50 super(watcher);
51 this.abortable = abortable;
52 this.serverManager = serverManager;
53 }
54
55
56
57
58
59
60
61
62 public void start() throws KeeperException {
63 watcher.registerListener(this);
64 ZKUtil.watchAndGetNewChildren(watcher, watcher.rsZNode);
65 }
66
67 @Override
68 public void nodeDeleted(String path) {
69 if(path.startsWith(watcher.rsZNode)) {
70 String serverName = ZKUtil.getNodeName(path);
71 LOG.info("RegionServer ephemeral node deleted, processing expiration [" +
72 serverName + "]");
73 HServerInfo hsi = serverManager.getServerInfo(serverName);
74 if(hsi == null) {
75 LOG.info("No HServerInfo found for " + serverName);
76 return;
77 }
78 serverManager.expireServer(hsi);
79 }
80 }
81
82 @Override
83 public void nodeChildrenChanged(String path) {
84 if(path.equals(watcher.rsZNode)) {
85 try {
86 ZKUtil.watchAndGetNewChildren(watcher, watcher.rsZNode);
87 } catch (KeeperException e) {
88 abortable.abort("Unexpected zk exception getting RS nodes", e);
89 }
90 }
91 }
92
93
94
95
96
97
98 public List<HServerAddress> getOnlineServers() throws KeeperException {
99 return ZKUtil.listChildrenAndGetAsAddresses(watcher, watcher.rsZNode);
100 }
101 }