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.assertEquals;
21 import static org.junit.Assert.assertFalse;
22 import static org.junit.Assert.assertNotNull;
23 import static org.mockito.Mockito.when;
24
25 import java.io.IOException;
26 import java.util.Collection;
27 import java.util.Iterator;
28 import java.util.List;
29
30 import org.apache.commons.logging.Log;
31 import org.apache.commons.logging.LogFactory;
32 import org.apache.hadoop.conf.Configuration;
33 import org.apache.hadoop.hbase.*;
34 import org.apache.hadoop.hbase.coordination.BaseCoordinatedStateManager;
35 import org.apache.hadoop.hbase.coordination.OpenRegionCoordination;
36 import org.apache.hadoop.hbase.coordination.ZkCoordinatedStateManager;
37 import org.apache.hadoop.hbase.coordination.ZkOpenRegionCoordination;
38 import org.apache.hadoop.hbase.executor.EventType;
39 import org.apache.hadoop.hbase.master.handler.OpenedRegionHandler;
40 import org.apache.hadoop.hbase.regionserver.HRegion;
41 import org.apache.hadoop.hbase.regionserver.HRegionServer;
42 import org.apache.hadoop.hbase.regionserver.Region;
43 import org.apache.hadoop.hbase.testclassification.MediumTests;
44 import org.apache.hadoop.hbase.util.Bytes;
45 import org.apache.hadoop.hbase.util.MockServer;
46 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
47 import org.apache.hadoop.hbase.zookeeper.ZKTableStateManager;
48 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
49 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
50 import org.apache.zookeeper.KeeperException;
51 import org.apache.zookeeper.data.Stat;
52 import org.junit.After;
53 import org.junit.Before;
54 import org.junit.Test;
55 import org.junit.experimental.categories.Category;
56 import org.mockito.Mockito;
57
58 @Category(MediumTests.class)
59 public class TestOpenedRegionHandler {
60
61 private static final Log LOG = LogFactory
62 .getLog(TestOpenedRegionHandler.class);
63
64 private HBaseTestingUtility TEST_UTIL;
65 private final int NUM_MASTERS = 1;
66 private final int NUM_RS = 1;
67 private Configuration conf;
68 private Configuration resetConf;
69 private ZooKeeperWatcher zkw;
70
71 @Before
72 public void setUp() throws Exception {
73 conf = HBaseConfiguration.create();
74 conf.setBoolean("hbase.assignment.usezk", true);
75 TEST_UTIL = HBaseTestingUtility.createLocalHTU(conf);
76 }
77
78 @After
79 public void tearDown() throws Exception {
80
81 TEST_UTIL.shutdownMiniCluster();
82 TEST_UTIL = new HBaseTestingUtility(resetConf);
83 }
84
85 @Test
86 public void testOpenedRegionHandlerOnMasterRestart() throws Exception {
87
88 log("Starting cluster");
89 conf = HBaseConfiguration.create();
90 conf.setBoolean("hbase.assignment.usezk", true);
91 resetConf = conf;
92 TEST_UTIL = new HBaseTestingUtility(conf);
93 TEST_UTIL.startMiniCluster(NUM_MASTERS, NUM_RS);
94 String tableName = "testOpenedRegionHandlerOnMasterRestart";
95 MiniHBaseCluster cluster = createRegions(tableName);
96 abortMaster(cluster);
97
98 HRegionServer regionServer = cluster.getRegionServer(0);
99 Region region = getRegionBeingServed(cluster, regionServer);
100
101
102
103 zkw = HBaseTestingUtility.createAndForceNodeToOpenedState(TEST_UTIL,
104 region, regionServer.getServerName());
105
106
107 log("Starting up a new master");
108 cluster.startMaster().getMaster();
109 log("Waiting for master to be ready");
110 cluster.waitForActiveAndReadyMaster();
111 log("Master is ready");
112
113
114 log("Waiting for no more RIT");
115 ZKAssign.blockUntilNoRIT(zkw);
116 }
117 @Test
118 public void testShouldNotCompeleteOpenedRegionSuccessfullyIfVersionMismatches()
119 throws Exception {
120 HRegion region = null;
121 try {
122 int testIndex = 0;
123 TEST_UTIL.startMiniZKCluster();
124 final Server server = new MockServer(TEST_UTIL);
125 HTableDescriptor htd = new HTableDescriptor(
126 TableName.valueOf("testShouldNotCompeleteOpenedRegionSuccessfullyIfVersionMismatches"));
127 HColumnDescriptor fam = new HColumnDescriptor("fam");
128 htd.addFamily(fam);
129 HRegionInfo hri = new HRegionInfo(htd.getTableName(),
130 Bytes.toBytes(testIndex), Bytes.toBytes(testIndex + 1));
131 region = HRegion.createHRegion(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL.getConfiguration(), htd);
132 assertNotNull(region);
133 AssignmentManager am = Mockito.mock(AssignmentManager.class);
134 RegionStates rsm = Mockito.mock(RegionStates.class);
135 Mockito.doReturn(rsm).when(am).getRegionStates();
136 when(rsm.isRegionInTransition(hri)).thenReturn(false);
137 when(rsm.getRegionState(hri)).thenReturn(
138 new RegionState(region.getRegionInfo(), RegionState.State.OPEN,
139 System.currentTimeMillis(), server.getServerName()));
140
141 zkw = HBaseTestingUtility.createAndForceNodeToOpenedState(TEST_UTIL,
142 region, server.getServerName());
143 when(am.getTableStateManager()).thenReturn(new ZKTableStateManager(zkw));
144 Stat stat = new Stat();
145 String nodeName = ZKAssign.getNodeName(zkw, region.getRegionInfo()
146 .getEncodedName());
147 ZKUtil.getDataAndWatch(zkw, nodeName, stat);
148
149
150 BaseCoordinatedStateManager csm = new ZkCoordinatedStateManager();
151 csm.initialize(server);
152 csm.start();
153
154 OpenRegionCoordination orc = csm.getOpenRegionCoordination();
155 ZkOpenRegionCoordination.ZkOpenRegionDetails zkOrd =
156 new ZkOpenRegionCoordination.ZkOpenRegionDetails();
157 zkOrd.setServerName(server.getServerName());
158 zkOrd.setVersion(stat.getVersion());
159 OpenedRegionHandler handler = new OpenedRegionHandler(server, am, region
160 .getRegionInfo(), orc, zkOrd);
161
162 ZKAssign.transitionNode(zkw, region.getRegionInfo(), server
163 .getServerName(), EventType.RS_ZK_REGION_OPENED,
164 EventType.RS_ZK_REGION_OPENED, stat.getVersion());
165
166
167
168 boolean expectedException = false;
169 try {
170 handler.process();
171 } catch (Exception e) {
172 expectedException = true;
173 }
174 assertFalse("The process method should not throw any exception.",
175 expectedException);
176 List<String> znodes = ZKUtil.listChildrenAndWatchForNewChildren(zkw,
177 zkw.assignmentZNode);
178 String regionName = znodes.get(0);
179 assertEquals("The region should not be opened successfully.", regionName,
180 region.getRegionInfo().getEncodedName());
181 } finally {
182 HRegion.closeHRegion(region);
183 TEST_UTIL.shutdownMiniZKCluster();
184 }
185 }
186 private MiniHBaseCluster createRegions(String tableName)
187 throws InterruptedException, ZooKeeperConnectionException, IOException,
188 KeeperException {
189 MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
190 log("Waiting for active/ready master");
191 cluster.waitForActiveAndReadyMaster();
192 zkw = new ZooKeeperWatcher(conf, "testOpenedRegionHandler", null);
193
194
195 byte[] table = Bytes.toBytes(tableName);
196 byte[] family = Bytes.toBytes("family");
197 TEST_UTIL.createTable(table, family);
198
199
200 log("Waiting for no more RIT");
201 ZKAssign.blockUntilNoRIT(zkw);
202
203 return cluster;
204 }
205 private void abortMaster(MiniHBaseCluster cluster) {
206
207 log("Aborting master");
208 cluster.abortMaster(0);
209 cluster.waitOnMaster(0);
210 log("Master has aborted");
211 }
212 private Region getRegionBeingServed(MiniHBaseCluster cluster,
213 HRegionServer regionServer) {
214 Collection<Region> onlineRegionsLocalContext = regionServer
215 .getOnlineRegionsLocalContext();
216 Iterator<Region> iterator = onlineRegionsLocalContext.iterator();
217 Region region = null;
218 while (iterator.hasNext()) {
219 region = iterator.next();
220 if (!region.getRegionInfo().isMetaTable()) {
221 break;
222 }
223 }
224 return region;
225 }
226 private void log(String msg) {
227 LOG.debug("\n\nTRR: " + msg + "\n");
228 }
229
230 }
231