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.master;
21
22 import java.io.IOException;
23 import java.util.List;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27 import org.apache.hadoop.conf.Configuration;
28 import org.apache.hadoop.hbase.executor.HBaseEventHandler.HBaseEventType;
29 import org.apache.hadoop.hbase.master.handler.MasterCloseRegionHandler;
30 import org.apache.hadoop.hbase.master.handler.MasterOpenRegionHandler;
31 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper;
32 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper.ZNodePathAndData;
33 import org.apache.zookeeper.KeeperException;
34 import org.apache.zookeeper.WatchedEvent;
35 import org.apache.zookeeper.Watcher;
36 import org.apache.zookeeper.Watcher.Event.EventType;
37
38
39
40
41
42 public class ZKUnassignedWatcher implements Watcher {
43 private static final Log LOG = LogFactory.getLog(ZKUnassignedWatcher.class);
44
45 private ZooKeeperWrapper zkWrapper;
46 String serverName;
47 ServerManager serverManager;
48
49 public static void start(Configuration conf, HMaster master)
50 throws IOException {
51 new ZKUnassignedWatcher(conf, master);
52 LOG.debug("Started ZKUnassigned watcher");
53 }
54
55 public ZKUnassignedWatcher(Configuration conf, HMaster master)
56 throws IOException {
57 this.serverName = master.getHServerAddress().toString();
58 this.serverManager = master.getServerManager();
59 zkWrapper = ZooKeeperWrapper.getInstance(conf, HMaster.class.getName());
60 String unassignedZNode = zkWrapper.getRegionInTransitionZNode();
61
62
63
64 if(master.isClusterStartup() && zkWrapper.exists(unassignedZNode, false)) {
65 LOG.info("Cluster start, but found " + unassignedZNode + ", deleting it.");
66 try {
67 zkWrapper.deleteZNode(unassignedZNode, true);
68 } catch (KeeperException e) {
69 LOG.error("Could not delete znode " + unassignedZNode, e);
70 throw new IOException(e);
71 } catch (InterruptedException e) {
72 LOG.error("Could not delete znode " + unassignedZNode, e);
73 throw new IOException(e);
74 }
75 }
76
77
78 zkWrapper.createZNodeIfNotExists(unassignedZNode);
79
80
81
82
83 zkWrapper.registerListener(this);
84 }
85
86
87
88
89
90
91
92 @Override
93 public synchronized void process(WatchedEvent event) {
94 EventType type = event.getType();
95 LOG.debug("ZK-EVENT-PROCESS: Got zkEvent " + type +
96 " state:" + event.getState() +
97 " path:" + event.getPath());
98
99
100 if(type.equals(EventType.None) ||
101 type.equals(EventType.NodeDeleted)) {
102 return;
103 }
104
105
106 if(event.getPath() == null ||
107 !event.getPath().startsWith(zkWrapper.getZNodePathForHBase(
108 zkWrapper.getRegionInTransitionZNode()))) {
109 return;
110 }
111
112 try
113 {
114
115
116
117
118
119
120 if(type.equals(EventType.NodeCreated)) {
121 zkWrapper.watchZNode(event.getPath());
122 handleRegionStateInZK(event.getPath());
123 }
124
125
126
127
128 else if(type.equals(EventType.NodeDataChanged)) {
129 handleRegionStateInZK(event.getPath());
130 }
131
132
133
134 else if(type.equals(EventType.NodeChildrenChanged)) {
135 List<ZNodePathAndData> newZNodes =
136 zkWrapper.watchAndGetNewChildren(event.getPath());
137 for(ZNodePathAndData zNodePathAndData : newZNodes) {
138 LOG.debug("Handling updates for znode: " + zNodePathAndData.getzNodePath());
139 handleRegionStateInZK(zNodePathAndData.getzNodePath(),
140 zNodePathAndData.getData());
141 }
142 }
143 }
144 catch (IOException e)
145 {
146 LOG.error("Could not process event from ZooKeeper", e);
147 }
148 }
149
150
151
152
153
154
155
156
157
158 private void handleRegionStateInZK(String zNodePath) throws IOException {
159 byte[] data = zkWrapper.readZNode(zNodePath, null);
160 handleRegionStateInZK(zNodePath, data);
161 }
162
163 private void handleRegionStateInZK(String zNodePath, byte[] data) {
164
165 if(data == null) {
166 return;
167 }
168 String rgnInTransitNode = zkWrapper.getRegionInTransitionZNode();
169 String region = zNodePath.substring(
170 zNodePath.indexOf(rgnInTransitNode) + rgnInTransitNode.length() + 1);
171 HBaseEventType rsEvent = HBaseEventType.fromByte(data[0]);
172 LOG.debug("Got event type [ " + rsEvent + " ] for region " + region);
173
174
175 if(rsEvent == HBaseEventType.RS2ZK_REGION_CLOSED) {
176 new MasterCloseRegionHandler(rsEvent, serverManager, serverName, region, data).submit();
177 }
178
179 else if(rsEvent == HBaseEventType.RS2ZK_REGION_OPENED ||
180 rsEvent == HBaseEventType.RS2ZK_REGION_OPENING) {
181 new MasterOpenRegionHandler(rsEvent, serverManager, serverName, region, data).submit();
182 }
183 }
184 }
185