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