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.MockRegionServerServices;
33 import org.apache.hadoop.hbase.util.MockServer;
34 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
35 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
36 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
37 import org.apache.zookeeper.KeeperException;
38 import org.apache.zookeeper.KeeperException.NodeExistsException;
39 import org.junit.AfterClass;
40 import org.junit.Before;
41 import org.junit.BeforeClass;
42 import org.junit.Test;
43 import org.junit.experimental.categories.Category;
44
45
46
47
48 @Category(MediumTests.class)
49 public class TestOpenRegionHandler {
50 static final Log LOG = LogFactory.getLog(TestOpenRegionHandler.class);
51 private final static HBaseTestingUtility HTU = new HBaseTestingUtility();
52 private static HTableDescriptor TEST_HTD;
53 private HRegionInfo TEST_HRI;
54
55 private int testIndex = 0;
56
57 @BeforeClass public static void before() throws Exception {
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 = new MockRegionServerServices(HTU.getZooKeeperWatcher());
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 @Test
134 public void testFailedOpenRegion() throws Exception {
135 Server server = new MockServer(HTU);
136 RegionServerServices rsServices = new MockRegionServerServices();
137
138
139 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
140
141
142 OpenRegionHandler handler =
143 new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
144 @Override
145 HRegion openRegion() {
146
147 return null;
148 }
149 };
150 rsServices.getRegionsInTransitionInRS().put(
151 TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
152 handler.process();
153
154
155 RegionTransition rt = RegionTransition.parseFrom(
156 ZKAssign.getData(server.getZooKeeper(), TEST_HRI.getEncodedName()));
157 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
158 }
159
160 @Test
161 public void testFailedUpdateMeta() throws Exception {
162 Server server = new MockServer(HTU);
163 RegionServerServices rsServices = new MockRegionServerServices();
164
165
166 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
167
168
169 OpenRegionHandler handler =
170 new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
171 @Override
172 boolean updateMeta(final HRegion r) {
173
174 return false;
175 }
176 };
177 rsServices.getRegionsInTransitionInRS().put(
178 TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
179 handler.process();
180
181
182 RegionTransition rt = RegionTransition.parseFrom(
183 ZKAssign.getData(server.getZooKeeper(), TEST_HRI.getEncodedName()));
184 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
185 }
186
187 @Test
188 public void testTransitionToFailedOpenEvenIfCleanupFails() throws Exception {
189 Server server = new MockServer(HTU);
190 RegionServerServices rsServices = new MockRegionServerServices();
191
192 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
193
194 OpenRegionHandler handler = new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
195 @Override
196 boolean updateMeta(HRegion r) {
197 return false;
198 };
199
200 @Override
201 void cleanupFailedOpen(HRegion region) throws IOException {
202 throw new IOException("FileSystem got closed.");
203 }
204 };
205 rsServices.getRegionsInTransitionInRS().put(TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
206 try {
207 handler.process();
208 } catch (Exception e) {
209
210 }
211 RegionTransition rt = RegionTransition.parseFrom(ZKAssign.getData(server.getZooKeeper(),
212 TEST_HRI.getEncodedName()));
213 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
214 }
215
216 @Test
217 public void testTransitionToFailedOpenFromOffline() throws Exception {
218 Server server = new MockServer(HTU);
219 RegionServerServices rsServices = new MockRegionServerServices(server.getZooKeeper(),
220 server.getServerName());
221
222 ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, server.getServerName());
223
224 OpenRegionHandler handler = new OpenRegionHandler(server, rsServices, TEST_HRI, TEST_HTD) {
225
226 @Override
227 boolean transitionZookeeperOfflineToOpening(String encodedName, int versionOfOfflineNode) {
228 return false;
229 }
230 };
231 rsServices.getRegionsInTransitionInRS().put(TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE);
232
233 handler.process();
234
235 RegionTransition rt = RegionTransition.parseFrom(ZKAssign.getData(server.getZooKeeper(),
236 TEST_HRI.getEncodedName()));
237 assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType());
238 }
239 }
240