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.regionserver.handler;
21
22 import static org.junit.Assert.*;
23
24 import java.io.IOException;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.hadoop.hbase.HBaseTestingUtility;
29 import org.apache.hadoop.hbase.HRegionInfo;
30 import org.apache.hadoop.hbase.HTableDescriptor;
31 import org.apache.hadoop.hbase.Server;
32 import org.apache.hadoop.hbase.executor.RegionTransitionData;
33 import org.apache.hadoop.hbase.executor.EventHandler.EventType;
34 import org.apache.hadoop.hbase.regionserver.HRegion;
35 import org.apache.hadoop.hbase.regionserver.RegionServerServices;
36 import org.apache.hadoop.hbase.util.Bytes;
37 import org.apache.hadoop.hbase.util.MockRegionServerServices;
38 import org.apache.hadoop.hbase.util.MockServer;
39 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
40 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
41 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
42 import org.apache.zookeeper.KeeperException;
43 import org.apache.zookeeper.KeeperException.NodeExistsException;
44 import org.junit.AfterClass;
45 import org.junit.Before;
46 import org.junit.BeforeClass;
47 import org.junit.Test;
48
49
50
51
52 public class TestOpenRegionHandler {
53 static final Log LOG = LogFactory.getLog(TestOpenRegionHandler.class);
54 private final static HBaseTestingUtility HTU = new HBaseTestingUtility();
55 private static HTableDescriptor TEST_HTD;
56 private HRegionInfo TEST_HRI;
57
58 private int testIndex = 0;
59
60 @BeforeClass public static void before() throws Exception {
61 HTU.startMiniZKCluster();
62 TEST_HTD = new HTableDescriptor("TestOpenRegionHandler.java");
63 }
64
65 @AfterClass public static void after() throws IOException {
66 TEST_HTD = null;
67 HTU.shutdownMiniZKCluster();
68 }
69
70
71
72
73
74
75 @Before
76 public void setupHRI() {
77 TEST_HRI = new HRegionInfo(TEST_HTD.getName(),
78 Bytes.toBytes(testIndex),
79 Bytes.toBytes(testIndex + 1));
80 testIndex++;
81 }
82
83
84
85
86
87
88
89
90
91 @Test public void testYankingRegionFromUnderIt()
92 throws IOException, NodeExistsException, KeeperException {
93 final Server server = new MockServer(HTU);
94 final RegionServerServices rss = new MockRegionServerServices();
95
96 HTableDescriptor htd = TEST_HTD;
97 final HRegionInfo hri = TEST_HRI;
98 HRegion region =
99 HRegion.createHRegion(hri, HTU.getDataTestDir(), HTU
100 .getConfiguration(), htd);
101 assertNotNull(region);
102 OpenRegionHandler handler = new OpenRegionHandler(server, rss, hri, htd) {
103 HRegion openRegion() {
104
105 HRegion region = super.openRegion();
106
107
108
109 ZooKeeperWatcher zkw = this.server.getZooKeeper();
110 String node = ZKAssign.getNodeName(zkw, hri.getEncodedName());
111 try {
112 ZKUtil.deleteNodeFailSilent(zkw, node);
113 } catch (KeeperException e) {
114 throw new RuntimeException("Ugh failed delete of " + node, e);
115 }
116 return region;
117 }
118 };
119
120
121 handler.process();
122 ZKAssign.createNodeOffline(server.getZooKeeper(), hri, server.getServerName());
123
124
125 handler.process();
126 }
127
128 @Test
129 public void testFailedOpenRegion() throws Exception {
130 Server server = new MockServer(HTU);
131 RegionServerServices rsServices = new MockRegionServerServices();
132
133
134 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
135
136
137 OpenRegionHandler handler =
138 new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
139 @Override
140 HRegion openRegion() {
141
142 return null;
143 }
144 };
145 handler.process();
146
147
148 RegionTransitionData data =
149 ZKAssign.getData(server.getZooKeeper(), TEST_HRI.getEncodedName());
150 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, data.getEventType());
151 }
152
153 @Test
154 public void testFailedUpdateMeta() throws Exception {
155 Server server = new MockServer(HTU);
156 RegionServerServices rsServices = new MockRegionServerServices();
157
158
159 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
160
161
162 OpenRegionHandler handler =
163 new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
164 @Override
165 boolean updateMeta(final HRegion r) {
166
167 return false;
168 }
169 };
170 handler.process();
171
172
173 RegionTransitionData data =
174 ZKAssign.getData(server.getZooKeeper(), TEST_HRI.getEncodedName());
175 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, data.getEventType());
176 }
177
178 }