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