1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.regionserver.handler;
20
21 import static org.junit.Assert.*;
22
23 import java.io.IOException;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27 import org.apache.hadoop.hbase.*;
28 import org.apache.hadoop.hbase.executor.EventType;
29 import org.apache.hadoop.hbase.regionserver.HRegion;
30 import org.apache.hadoop.hbase.regionserver.RegionServerServices;
31 import org.apache.hadoop.hbase.util.Bytes;
32 import org.apache.hadoop.hbase.util.MockServer;
33 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
34 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
35 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
36 import org.apache.zookeeper.KeeperException;
37 import org.apache.zookeeper.KeeperException.NodeExistsException;
38 import org.junit.AfterClass;
39 import org.junit.Before;
40 import org.junit.BeforeClass;
41 import org.junit.Test;
42 import org.junit.experimental.categories.Category;
43
44
45
46
47 @Category(MediumTests.class)
48 public class TestOpenRegionHandler {
49 static final Log LOG = LogFactory.getLog(TestOpenRegionHandler.class);
50 private final static HBaseTestingUtility HTU = HBaseTestingUtility.createLocalHTU();
51 private static HTableDescriptor TEST_HTD;
52 private HRegionInfo TEST_HRI;
53
54 private int testIndex = 0;
55
56 @BeforeClass public static void before() throws Exception {
57 HTU.getConfiguration().setBoolean("hbase.assignment.usezk", true);
58 HTU.startMiniZKCluster();
59 TEST_HTD = new HTableDescriptor(TableName.valueOf("TestOpenRegionHandler.java"));
60 }
61
62 @AfterClass public static void after() throws IOException {
63 TEST_HTD = null;
64 HTU.shutdownMiniZKCluster();
65 }
66
67
68
69
70
71
72 @Before
73 public void setupHRI() {
74 TEST_HRI = new HRegionInfo(TEST_HTD.getTableName(),
75 Bytes.toBytes(testIndex),
76 Bytes.toBytes(testIndex + 1));
77 testIndex++;
78 }
79
80
81
82
83
84
85
86
87
88 @Test public void testYankingRegionFromUnderIt()
89 throws IOException, NodeExistsException, KeeperException {
90 final Server server = new MockServer(HTU);
91 final RegionServerServices rss = HTU.createMockRegionServerService();
92
93 HTableDescriptor htd = TEST_HTD;
94 final HRegionInfo hri = TEST_HRI;
95 HRegion region =
96 HRegion.createHRegion(hri, HTU.getDataTestDir(), HTU
97 .getConfiguration(), htd);
98 assertNotNull(region);
99 try {
100 OpenRegionHandler handler = new OpenRegionHandler(server, rss, hri, htd) {
101 HRegion openRegion() {
102
103 HRegion region = super.openRegion();
104
105
106
107 ZooKeeperWatcher zkw = this.server.getZooKeeper();
108 String node = ZKAssign.getNodeName(zkw, hri.getEncodedName());
109 try {
110 ZKUtil.deleteNodeFailSilent(zkw, node);
111 } catch (KeeperException e) {
112 throw new RuntimeException("Ugh failed delete of " + node, e);
113 }
114 return region;
115 }
116 };
117 rss.getRegionsInTransitionInRS().put(
118 hri.getEncodedNameAsBytes(), Boolean.TRUE);
119
120
121 handler.process();
122 rss.getRegionsInTransitionInRS().put(
123 hri.getEncodedNameAsBytes(), Boolean.TRUE);
124 ZKAssign.createNodeOffline(server.getZooKeeper(), hri, server.getServerName());
125
126
127 handler.process();
128 } finally {
129 HRegion.closeHRegion(region);
130 }
131 }
132
133
134
135
136
137
138
139
140
141 @Test
142 public void testRegionServerAbortionDueToFailureTransitioningToOpened()
143 throws IOException, NodeExistsException, KeeperException {
144 final Server server = new MockServer(HTU);
145 final RegionServerServices rss = HTU.createMockRegionServerService();
146
147 HTableDescriptor htd = TEST_HTD;
148 final HRegionInfo hri = TEST_HRI;
149 HRegion region =
150 HRegion.createHRegion(hri, HTU.getDataTestDir(), HTU
151 .getConfiguration(), htd);
152 assertNotNull(region);
153 try {
154 OpenRegionHandler handler = new OpenRegionHandler(server, rss, hri, htd) {
155 boolean transitionToOpened(final HRegion r) throws IOException {
156
157 ZooKeeperWatcher zkw = this.server.getZooKeeper();
158 String node = ZKAssign.getNodeName(zkw, hri.getEncodedName());
159 try {
160 ZKUtil.deleteNodeFailSilent(zkw, node);
161 } catch (KeeperException e) {
162 throw new RuntimeException("Ugh failed delete of " + node, e);
163 }
164
165 return super.transitionToOpened(r);
166 }
167 };
168 rss.getRegionsInTransitionInRS().put(
169 hri.getEncodedNameAsBytes(), Boolean.TRUE);
170
171
172 handler.process();
173 rss.getRegionsInTransitionInRS().put(
174 hri.getEncodedNameAsBytes(), Boolean.TRUE);
175 ZKAssign.createNodeOffline(server.getZooKeeper(), hri, server.getServerName());
176
177
178 handler.process();
179 } catch (IOException ioe) {
180 } finally {
181 HRegion.closeHRegion(region);
182 }
183
184
185
186 assertTrue("region server should have aborted", rss.isAborted());
187 }
188
189 @Test
190 public void testFailedOpenRegion() throws Exception {
191 Server server = new MockServer(HTU);
192 RegionServerServices rsServices = HTU.createMockRegionServerService();
193
194
195 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
196
197
198 OpenRegionHandler handler =
199 new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
200 @Override
201 HRegion openRegion() {
202
203 return null;
204 }
205 };
206 rsServices.getRegionsInTransitionInRS().put(
207 TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
208 handler.process();
209
210
211 RegionTransition rt = RegionTransition.parseFrom(
212 ZKAssign.getData(server.getZooKeeper(), TEST_HRI.getEncodedName()));
213 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
214 }
215
216 @Test
217 public void testFailedUpdateMeta() throws Exception {
218 Server server = new MockServer(HTU);
219 RegionServerServices rsServices = HTU.createMockRegionServerService();
220
221
222 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
223
224
225 OpenRegionHandler handler =
226 new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
227 @Override
228 boolean updateMeta(final HRegion r) {
229
230 return false;
231 }
232 };
233 rsServices.getRegionsInTransitionInRS().put(
234 TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
235 handler.process();
236
237
238 RegionTransition rt = RegionTransition.parseFrom(
239 ZKAssign.getData(server.getZooKeeper(), TEST_HRI.getEncodedName()));
240 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
241 }
242
243 @Test
244 public void testTransitionToFailedOpenEvenIfCleanupFails() throws Exception {
245 Server server = new MockServer(HTU);
246 RegionServerServices rsServices = HTU.createMockRegionServerService();
247
248 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
249
250 OpenRegionHandler handler = new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
251 @Override
252 boolean updateMeta(HRegion r) {
253 return false;
254 };
255
256 @Override
257 void cleanupFailedOpen(HRegion region) throws IOException {
258 throw new IOException("FileSystem got closed.");
259 }
260 };
261 rsServices.getRegionsInTransitionInRS().put(TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
262 try {
263 handler.process();
264 } catch (Exception e) {
265
266 }
267 RegionTransition rt = RegionTransition.parseFrom(ZKAssign.getData(server.getZooKeeper(),
268 TEST_HRI.getEncodedName()));
269 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
270 }
271
272 @Test
273 public void testTransitionToFailedOpenFromOffline() throws Exception {
274 Server server = new MockServer(HTU);
275 RegionServerServices rsServices = HTU.createMockRegionServerService(server.getServerName());
276
277 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
278
279 OpenRegionHandler handler = new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
280
281 @Override
282 boolean transitionZookeeperOfflineToOpening(String encodedName, int versionOfOfflineNode) {
283 return false;
284 }
285 };
286 rsServices.getRegionsInTransitionInRS().put(TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
287
288 handler.process();
289
290 RegionTransition rt = RegionTransition.parseFrom(ZKAssign.getData(server.getZooKeeper(),
291 TEST_HRI.getEncodedName()));
292 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
293 }
294
295 }
296