1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.master;
19
20 import static org.junit.Assert.assertNotSame;
21
22 import org.apache.hadoop.hbase.exceptions.DeserializationException;
23 import org.apache.hadoop.hbase.HRegionInfo;
24 import org.apache.hadoop.hbase.RegionTransition;
25 import org.apache.hadoop.hbase.ServerName;
26 import org.apache.hadoop.hbase.executor.EventType;
27 import org.apache.hadoop.hbase.master.RegionState.State;
28 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
29 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
30 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
31 import org.apache.zookeeper.KeeperException;
32
33
34
35
36 public class Mocking {
37
38 static void waitForRegionFailedToCloseAndSetToPendingClose(
39 AssignmentManager am, HRegionInfo hri) throws InterruptedException {
40
41
42 boolean wait = true;
43 while (wait) {
44 RegionState state = am.getRegionStates().getRegionState(hri);
45 if (state != null && state.isFailedClose()){
46 am.getRegionStates().updateRegionState(hri, State.PENDING_CLOSE);
47 wait = false;
48 } else {
49 Thread.sleep(1);
50 }
51 }
52 }
53
54 static void waitForRegionPendingOpenInRIT(AssignmentManager am, String encodedName)
55 throws InterruptedException {
56
57
58
59
60
61
62
63 boolean wait = true;
64 while (wait) {
65 RegionState state = am.getRegionStates()
66 .getRegionsInTransition().get(encodedName);
67 if (state != null && state.isPendingOpen()){
68 wait = false;
69 } else {
70 Thread.sleep(1);
71 }
72 }
73 }
74
75
76
77
78
79
80
81
82
83 static void fakeRegionServerRegionOpenInZK(HMaster master, final ZooKeeperWatcher w,
84 final ServerName sn, final HRegionInfo hri)
85 throws KeeperException, DeserializationException, InterruptedException {
86
87 waitForRegionPendingOpenInRIT(master.getAssignmentManager(), hri.getEncodedName());
88
89
90 int versionid = ZKAssign.getVersion(w, hri);
91 assertNotSame(-1, versionid);
92
93
94
95 versionid = ZKAssign.transitionNode(w, hri, sn,
96 EventType.M_ZK_REGION_OFFLINE, EventType.RS_ZK_REGION_OPENING, versionid);
97 assertNotSame(-1, versionid);
98
99 versionid = ZKAssign.transitionNodeOpened(w, hri, sn, versionid);
100 assertNotSame(-1, versionid);
101
102
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 static boolean verifyRegionState(ZooKeeperWatcher zkw, HRegionInfo region, EventType expectedState)
121 throws KeeperException, DeserializationException {
122 String encoded = region.getEncodedName();
123
124 String node = ZKAssign.getNodeName(zkw, encoded);
125 zkw.sync(node);
126
127
128 byte [] existingBytes = null;
129 try {
130 existingBytes = ZKUtil.getDataAndWatch(zkw, node);
131 } catch (KeeperException.NoNodeException nne) {
132 return false;
133 } catch (KeeperException e) {
134 throw e;
135 }
136 if (existingBytes == null) return false;
137 RegionTransition rt = RegionTransition.parseFrom(existingBytes);
138 return rt.getEventType().equals(expectedState);
139 }
140 }