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 import java.util.List;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.apache.hadoop.classification.InterfaceAudience;
26 import org.apache.hadoop.hbase.HRegionInfo;
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.zookeeper.ZKAssign;
33 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
34 import org.apache.zookeeper.KeeperException;
35 import org.apache.zookeeper.KeeperException.NoNodeException;
36
37
38
39
40
41
42 @InterfaceAudience.Private
43 public class MergedRegionHandler extends EventHandler implements
44 TotesHRegionInfo {
45 private static final Log LOG = LogFactory.getLog(MergedRegionHandler.class);
46 private final AssignmentManager assignmentManager;
47 private final HRegionInfo merged;
48 private final HRegionInfo region_a;
49 private final HRegionInfo region_b;
50 private final ServerName sn;
51
52 public MergedRegionHandler(Server server,
53 AssignmentManager assignmentManager, ServerName sn,
54 final List<HRegionInfo> mergeRegions) {
55 super(server, EventType.RS_ZK_REGION_MERGED);
56 assert mergeRegions.size() == 3;
57 this.assignmentManager = assignmentManager;
58 this.merged = mergeRegions.get(0);
59 this.region_a = mergeRegions.get(1);
60 this.region_b = mergeRegions.get(2);
61 this.sn = sn;
62 }
63
64 @Override
65 public HRegionInfo getHRegionInfo() {
66 return this.merged;
67 }
68
69 @Override
70 public String toString() {
71 String name = "UnknownServerName";
72 if (server != null && server.getServerName() != null) {
73 name = server.getServerName().toString();
74 }
75 String mergedRegion = "UnknownRegion";
76 if (merged != null) {
77 mergedRegion = merged.getRegionNameAsString();
78 }
79 return getClass().getSimpleName() + "-" + name + "-" + getSeqid() + "-"
80 + mergedRegion;
81 }
82
83 @Override
84 public void process() {
85 String encodedRegionName = this.merged.getEncodedName();
86 LOG.debug("Handling MERGE event for " + encodedRegionName
87 + "; deleting node");
88
89 this.assignmentManager.handleRegionsMergeReport(this.sn, this.merged,
90 this.region_a, this.region_b);
91
92 try {
93
94 boolean successful = false;
95 while (!successful) {
96
97
98 successful = ZKAssign.deleteNode(this.server.getZooKeeper(),
99 encodedRegionName, EventType.RS_ZK_REGION_MERGED);
100 }
101 } catch (KeeperException e) {
102 if (e instanceof NoNodeException) {
103 String znodePath = ZKUtil.joinZNode(
104 this.server.getZooKeeper().splitLogZNode, encodedRegionName);
105 LOG.debug("The znode " + znodePath
106 + " does not exist. May be deleted already.");
107 } else {
108 server.abort("Error deleting MERGED node in ZK for transition ZK node ("
109 + merged.getEncodedName() + ")", e);
110 }
111 }
112 LOG.info("Handled MERGED event; merged="
113 + this.merged.getRegionNameAsString() + " region_a="
114 + this.region_a.getRegionNameAsString() + "region_b="
115 + this.region_b.getRegionNameAsString());
116 }
117 }