1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.master.handler;
20
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.apache.hadoop.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.HRegionInfo;
26 import org.apache.hadoop.hbase.Server;
27 import org.apache.hadoop.hbase.ServerName;
28 import org.apache.hadoop.hbase.executor.EventHandler;
29 import org.apache.hadoop.hbase.executor.EventType;
30 import org.apache.hadoop.hbase.master.AssignmentManager;
31 import org.apache.hadoop.hbase.master.RegionState;
32 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
33 import org.apache.zookeeper.KeeperException;
34
35
36
37
38 @InterfaceAudience.Private
39 public class OpenedRegionHandler extends EventHandler implements TotesHRegionInfo {
40 private static final Log LOG = LogFactory.getLog(OpenedRegionHandler.class);
41 private final AssignmentManager assignmentManager;
42 private final HRegionInfo regionInfo;
43 private final ServerName sn;
44 private final OpenedPriority priority;
45 private final int expectedVersion;
46
47 private enum OpenedPriority {
48 META (1),
49 USER (2);
50
51 private final int value;
52 OpenedPriority(int value) {
53 this.value = value;
54 }
55 public int getValue() {
56 return value;
57 }
58 };
59
60 public OpenedRegionHandler(Server server,
61 AssignmentManager assignmentManager, HRegionInfo regionInfo,
62 ServerName sn, int expectedVersion) {
63 super(server, EventType.RS_ZK_REGION_OPENED);
64 this.assignmentManager = assignmentManager;
65 this.regionInfo = regionInfo;
66 this.sn = sn;
67 this.expectedVersion = expectedVersion;
68 if(regionInfo.isMetaRegion()) {
69 priority = OpenedPriority.META;
70 } else {
71 priority = OpenedPriority.USER;
72 }
73 }
74
75 @Override
76 public int getPriority() {
77 return priority.getValue();
78 }
79
80 @Override
81 public HRegionInfo getHRegionInfo() {
82 return this.regionInfo;
83 }
84
85 @Override
86 public String toString() {
87 String name = "UnknownServerName";
88 if(server != null && server.getServerName() != null) {
89 name = server.getServerName().toString();
90 }
91 return getClass().getSimpleName() + "-" + name + "-" + getSeqid();
92 }
93
94 @Override
95 public void process() {
96
97
98 RegionState regionState = this.assignmentManager.getRegionStates()
99 .getRegionTransitionState(regionInfo.getEncodedName());
100 boolean openedNodeDeleted = false;
101 if (regionState != null && regionState.isOpened()) {
102 openedNodeDeleted = deleteOpenedNode(expectedVersion);
103 if (!openedNodeDeleted) {
104 LOG.error("The znode of region " + regionInfo.getRegionNameAsString()
105 + " could not be deleted.");
106 }
107 } else {
108 LOG.warn("Skipping the onlining of " + regionInfo.getRegionNameAsString() +
109 " because regions is NOT in RIT -- presuming this is because it SPLIT");
110 }
111 if (!openedNodeDeleted) {
112 if (this.assignmentManager.getZKTable().isDisablingOrDisabledTable(
113 regionInfo.getTableNameAsString())) {
114 debugLog(regionInfo, "Opened region "
115 + regionInfo.getRegionNameAsString() + " but "
116 + "this table is disabled, triggering close of region");
117 assignmentManager.unassign(regionInfo);
118 }
119 }
120 }
121
122 private boolean deleteOpenedNode(int expectedVersion) {
123 debugLog(regionInfo, "Handling OPENED event for " +
124 this.regionInfo.getRegionNameAsString() + " from " + this.sn.toString() +
125 "; deleting unassigned node");
126 try {
127
128 return ZKAssign.deleteNode(server.getZooKeeper(),
129 regionInfo.getEncodedName(), EventType.RS_ZK_REGION_OPENED, expectedVersion);
130 } catch(KeeperException.NoNodeException e){
131
132 LOG.warn("The znode of the region " + regionInfo.getRegionNameAsString() +
133 " would have already been deleted");
134 return false;
135 } catch (KeeperException e) {
136 server.abort("Error deleting OPENED node in ZK (" +
137 regionInfo.getRegionNameAsString() + ")", e);
138 }
139 return false;
140 }
141
142 private void debugLog(HRegionInfo region, String string) {
143 if (region.isMetaTable()) {
144 LOG.info(string);
145 } else {
146 LOG.debug(string);
147 }
148 }
149 }