1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver.handler;
19
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertNotNull;
22 import static org.junit.Assert.assertTrue;
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.TableName;
29 import org.apache.hadoop.hbase.exceptions.DeserializationException;
30 import org.apache.hadoop.hbase.HBaseTestingUtility;
31 import org.apache.hadoop.hbase.HConstants;
32 import org.apache.hadoop.hbase.HRegionInfo;
33 import org.apache.hadoop.hbase.HTableDescriptor;
34 import org.apache.hadoop.hbase.MediumTests;
35 import org.apache.hadoop.hbase.RegionTransition;
36 import org.apache.hadoop.hbase.Server;
37 import org.apache.hadoop.hbase.executor.EventType;
38 import org.apache.hadoop.hbase.regionserver.HRegion;
39 import org.apache.hadoop.hbase.regionserver.RegionServerServices;
40 import org.apache.hadoop.hbase.util.Bytes;
41 import org.apache.hadoop.hbase.util.MockRegionServerServices;
42 import org.apache.hadoop.hbase.util.MockServer;
43 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
44 import org.apache.zookeeper.KeeperException;
45 import org.apache.zookeeper.KeeperException.NodeExistsException;
46 import org.junit.AfterClass;
47 import org.junit.Before;
48 import org.junit.BeforeClass;
49 import org.junit.Test;
50 import org.junit.experimental.categories.Category;
51 import org.mockito.Mockito;
52
53
54
55
56 @Category(MediumTests.class)
57 public class TestCloseRegionHandler {
58 static final Log LOG = LogFactory.getLog(TestCloseRegionHandler.class);
59 private final static HBaseTestingUtility HTU = new HBaseTestingUtility();
60 private static final HTableDescriptor TEST_HTD =
61 new HTableDescriptor(TableName.valueOf("TestCloseRegionHandler"));
62 private HRegionInfo TEST_HRI;
63 private int testIndex = 0;
64
65 @BeforeClass public static void before() throws Exception {
66 HTU.startMiniZKCluster();
67 }
68
69 @AfterClass public static void after() throws IOException {
70 HTU.shutdownMiniZKCluster();
71 }
72
73
74
75
76
77
78 @Before
79 public void setupHRI() {
80 TEST_HRI = new HRegionInfo(TEST_HTD.getTableName(),
81 Bytes.toBytes(testIndex),
82 Bytes.toBytes(testIndex + 1));
83 testIndex++;
84 }
85
86
87
88
89
90
91
92
93 @Test public void testFailedFlushAborts()
94 throws IOException, NodeExistsException, KeeperException {
95 final Server server = new MockServer(HTU, false);
96 final RegionServerServices rss = new MockRegionServerServices();
97 HTableDescriptor htd = TEST_HTD;
98 final HRegionInfo hri =
99 new HRegionInfo(htd.getTableName(), HConstants.EMPTY_END_ROW,
100 HConstants.EMPTY_END_ROW);
101 HRegion region =
102 HRegion.createHRegion(hri, HTU.getDataTestDir(),
103 HTU.getConfiguration(), htd);
104 try {
105 assertNotNull(region);
106
107 HRegion spy = Mockito.spy(region);
108 final boolean abort = false;
109 Mockito.when(spy.close(abort)).
110 thenThrow(new RuntimeException("Mocked failed close!"));
111
112
113 rss.addToOnlineRegions(spy);
114
115 assertFalse(server.isStopped());
116 CloseRegionHandler handler =
117 new CloseRegionHandler(server, rss, hri, false, false, -1);
118 boolean throwable = false;
119 try {
120 handler.process();
121 } catch (Throwable t) {
122 throwable = true;
123 } finally {
124 assertTrue(throwable);
125
126 assertTrue(server.isStopped());
127 }
128 } finally {
129 HRegion.closeHRegion(region);
130 }
131 }
132
133
134
135
136
137
138
139
140 @Test public void testZKClosingNodeVersionMismatch()
141 throws IOException, NodeExistsException, KeeperException, DeserializationException {
142 final Server server = new MockServer(HTU);
143 final MockRegionServerServices rss = new MockRegionServerServices();
144 rss.setFileSystem(HTU.getTestFileSystem());
145
146 HTableDescriptor htd = TEST_HTD;
147 final HRegionInfo hri = TEST_HRI;
148
149
150 OpenRegion(server, rss, htd, hri);
151
152
153
154 int versionOfClosingNode = ZKAssign.createNodeClosing(server.getZooKeeper(),
155 hri, server.getServerName());
156
157
158
159
160 CloseRegionHandler handler =
161 new CloseRegionHandler(server, rss, hri, false, true,
162 versionOfClosingNode+1);
163 handler.process();
164
165
166 RegionTransition rt =
167 RegionTransition.parseFrom(ZKAssign.getData(server.getZooKeeper(), hri.getEncodedName()));
168 assertTrue(rt.getEventType().equals(EventType.M_ZK_REGION_CLOSING ));
169 }
170
171
172
173
174
175
176
177
178 @Test public void testCloseRegion()
179 throws IOException, NodeExistsException, KeeperException, DeserializationException {
180 final Server server = new MockServer(HTU);
181 final MockRegionServerServices rss = new MockRegionServerServices();
182 rss.setFileSystem(HTU.getTestFileSystem());
183
184 HTableDescriptor htd = TEST_HTD;
185 HRegionInfo hri = TEST_HRI;
186
187
188 OpenRegion(server, rss, htd, hri);
189
190
191
192 int versionOfClosingNode = ZKAssign.createNodeClosing(server.getZooKeeper(),
193 hri, server.getServerName());
194
195
196
197
198 CloseRegionHandler handler =
199 new CloseRegionHandler(server, rss, hri, false, true,
200 versionOfClosingNode);
201 handler.process();
202
203 RegionTransition rt = RegionTransition.parseFrom(
204 ZKAssign.getData(server.getZooKeeper(), hri.getEncodedName()));
205 assertTrue(rt.getEventType().equals(EventType.RS_ZK_REGION_CLOSED));
206 }
207
208 private void OpenRegion(Server server, RegionServerServices rss,
209 HTableDescriptor htd, HRegionInfo hri)
210 throws IOException, NodeExistsException, KeeperException, DeserializationException {
211
212 ZKAssign.createNodeOffline(server.getZooKeeper(), hri, server.getServerName());
213 OpenRegionHandler openHandler = new OpenRegionHandler(server, rss, hri, htd);
214 rss.getRegionsInTransitionInRS().put(hri.getEncodedNameAsBytes(), Boolean.TRUE);
215 openHandler.process();
216
217 RegionTransition.parseFrom(ZKAssign.getData(server.getZooKeeper(), hri.getEncodedName()));
218
219 ZKAssign.deleteNode(server.getZooKeeper(), hri.getEncodedName(), EventType.RS_ZK_REGION_OPENED);
220 }
221
222 }
223