http://git-wip-us.apache.org/repos/asf/hbase/blob/17dff681/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java deleted file mode 100644 index 4a3d4f2..0000000 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java +++ /dev/null @@ -1,1475 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.hadoop.hbase.master; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.apache.hadoop.hbase.CellScannable; -import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.CoordinatedStateException; -import org.apache.hadoop.hbase.CoordinatedStateManager; -import org.apache.hadoop.hbase.CoordinatedStateManagerFactory; -import org.apache.hadoop.hbase.DoNotRetryIOException; -import org.apache.hadoop.hbase.HBaseConfiguration; -import org.apache.hadoop.hbase.HBaseTestingUtility; -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.HRegionInfo; -import org.apache.hadoop.hbase.MediumTests; -import org.apache.hadoop.hbase.RegionException; -import org.apache.hadoop.hbase.RegionTransition; -import org.apache.hadoop.hbase.Server; -import org.apache.hadoop.hbase.ServerLoad; -import org.apache.hadoop.hbase.ServerName; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.ZooKeeperConnectionException; -import org.apache.hadoop.hbase.MetaMockingUtil; -import org.apache.hadoop.hbase.client.HConnection; -import org.apache.hadoop.hbase.client.HConnectionTestingUtility; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.coordination.ZkCoordinatedStateManager; -import org.apache.hadoop.hbase.coordination.BaseCoordinatedStateManager; -import org.apache.hadoop.hbase.coordination.OpenRegionCoordination; -import org.apache.hadoop.hbase.coordination.ZkOpenRegionCoordination; -import org.apache.hadoop.hbase.exceptions.DeserializationException; -import org.apache.hadoop.hbase.executor.EventType; -import org.apache.hadoop.hbase.executor.ExecutorService; -import org.apache.hadoop.hbase.executor.ExecutorType; -import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController; -import org.apache.hadoop.hbase.master.RegionState.State; -import org.apache.hadoop.hbase.master.TableLockManager.NullTableLockManager; -import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory; -import org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer; -import org.apache.hadoop.hbase.master.handler.EnableTableHandler; -import org.apache.hadoop.hbase.master.handler.ServerShutdownHandler; -import org.apache.hadoop.hbase.protobuf.ProtobufUtil; -import org.apache.hadoop.hbase.protobuf.generated.ClientProtos; -import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest; -import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetResponse; -import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest; -import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse; -import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos.Table; -import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos.SplitLogTask.RecoveryMode; -import org.apache.hadoop.hbase.regionserver.RegionOpeningState; -import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; -import org.apache.hadoop.hbase.util.Threads; -import org.apache.hadoop.hbase.zookeeper.MetaTableLocator; -import org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper; -import org.apache.hadoop.hbase.zookeeper.ZKAssign; -import org.apache.hadoop.hbase.zookeeper.ZKUtil; -import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.NodeExistsException; -import org.apache.zookeeper.Watcher; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.mockito.Mockito; -import org.mockito.internal.util.reflection.Whitebox; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import com.google.protobuf.RpcController; -import com.google.protobuf.ServiceException; - - -/** - * Test {@link AssignmentManager} - */ -@Category(MediumTests.class) -public class TestAssignmentManager { - private static final HBaseTestingUtility HTU = new HBaseTestingUtility(); - private static final ServerName SERVERNAME_A = - ServerName.valueOf("example.org", 1234, 5678); - private static final ServerName SERVERNAME_B = - ServerName.valueOf("example.org", 0, 5678); - private static final HRegionInfo REGIONINFO = - new HRegionInfo(TableName.valueOf("t"), - HConstants.EMPTY_START_ROW, HConstants.EMPTY_START_ROW); - private static int assignmentCount; - private static boolean enabling = false; - - // Mocked objects or; get redone for each test. - private Server server; - private ServerManager serverManager; - private ZooKeeperWatcher watcher; - private CoordinatedStateManager cp; - private MetaTableLocator mtl; - private LoadBalancer balancer; - private HMaster master; - - @BeforeClass - public static void beforeClass() throws Exception { - HTU.getConfiguration().setBoolean("hbase.assignment.usezk", true); - HTU.startMiniZKCluster(); - } - - @AfterClass - public static void afterClass() throws IOException { - HTU.shutdownMiniZKCluster(); - } - - @Before - public void before() throws ZooKeeperConnectionException, IOException { - // TODO: Make generic versions of what we do below and put up in a mocking - // utility class or move up into HBaseTestingUtility. - - // Mock a Server. Have it return a legit Configuration and ZooKeeperWatcher. - // If abort is called, be sure to fail the test (don't just swallow it - // silently as is mockito default). - this.server = Mockito.mock(Server.class); - Mockito.when(server.getServerName()).thenReturn(ServerName.valueOf("master,1,1")); - Mockito.when(server.getConfiguration()).thenReturn(HTU.getConfiguration()); - this.watcher = - new ZooKeeperWatcher(HTU.getConfiguration(), "mockedServer", this.server, true); - Mockito.when(server.getZooKeeper()).thenReturn(this.watcher); - Mockito.doThrow(new RuntimeException("Aborted")). - when(server).abort(Mockito.anyString(), (Throwable)Mockito.anyObject()); - - cp = new ZkCoordinatedStateManager(); - cp.initialize(this.server); - cp.start(); - - mtl = Mockito.mock(MetaTableLocator.class); - - Mockito.when(server.getCoordinatedStateManager()).thenReturn(cp); - Mockito.when(server.getMetaTableLocator()).thenReturn(mtl); - - // Get a connection w/ mocked up common methods. - HConnection connection = - HConnectionTestingUtility.getMockedConnection(HTU.getConfiguration()); - - // Make it so we can get a catalogtracker from servermanager.. .needed - // down in guts of server shutdown handler. - Mockito.when(server.getShortCircuitConnection()).thenReturn(connection); - - // Mock a ServerManager. Say server SERVERNAME_{A,B} are online. Also - // make it so if close or open, we return 'success'. - this.serverManager = Mockito.mock(ServerManager.class); - Mockito.when(this.serverManager.isServerOnline(SERVERNAME_A)).thenReturn(true); - Mockito.when(this.serverManager.isServerOnline(SERVERNAME_B)).thenReturn(true); - Mockito.when(this.serverManager.getDeadServers()).thenReturn(new DeadServer()); - final Map<ServerName, ServerLoad> onlineServers = new HashMap<ServerName, ServerLoad>(); - onlineServers.put(SERVERNAME_B, ServerLoad.EMPTY_SERVERLOAD); - onlineServers.put(SERVERNAME_A, ServerLoad.EMPTY_SERVERLOAD); - Mockito.when(this.serverManager.getOnlineServersList()).thenReturn( - new ArrayList<ServerName>(onlineServers.keySet())); - Mockito.when(this.serverManager.getOnlineServers()).thenReturn(onlineServers); - - List<ServerName> avServers = new ArrayList<ServerName>(); - avServers.addAll(onlineServers.keySet()); - Mockito.when(this.serverManager.createDestinationServersList()).thenReturn(avServers); - Mockito.when(this.serverManager.createDestinationServersList(null)).thenReturn(avServers); - - Mockito.when(this.serverManager.sendRegionClose(SERVERNAME_A, REGIONINFO, -1)). - thenReturn(true); - Mockito.when(this.serverManager.sendRegionClose(SERVERNAME_B, REGIONINFO, -1)). - thenReturn(true); - // Ditto on open. - Mockito.when(this.serverManager.sendRegionOpen(SERVERNAME_A, REGIONINFO, -1, null)). - thenReturn(RegionOpeningState.OPENED); - Mockito.when(this.serverManager.sendRegionOpen(SERVERNAME_B, REGIONINFO, -1, null)). - thenReturn(RegionOpeningState.OPENED); - this.master = Mockito.mock(HMaster.class); - - Mockito.when(this.master.getServerManager()).thenReturn(serverManager); - } - - @After - public void after() throws KeeperException { - if (this.watcher != null) { - // Clean up all znodes - ZKAssign.deleteAllNodes(this.watcher); - this.watcher.close(); - this.cp.stop(); - } - } - - /** - * Test a balance going on at same time as a master failover - * - * @throws IOException - * @throws KeeperException - * @throws InterruptedException - * @throws DeserializationException - */ - @Test(timeout = 60000) - public void testBalanceOnMasterFailoverScenarioWithOpenedNode() - throws IOException, KeeperException, InterruptedException, ServiceException, - DeserializationException, CoordinatedStateException { - AssignmentManagerWithExtrasForTesting am = - setUpMockedAssignmentManager(this.server, this.serverManager); - try { - createRegionPlanAndBalance(am, SERVERNAME_A, SERVERNAME_B, REGIONINFO); - startFakeFailedOverMasterAssignmentManager(am, this.watcher); - while (!am.processRITInvoked) Thread.sleep(1); - // As part of the failover cleanup, the balancing region plan is removed. - // So a random server will be used to open the region. For testing purpose, - // let's assume it is going to open on server b: - am.addPlan(REGIONINFO.getEncodedName(), new RegionPlan(REGIONINFO, null, SERVERNAME_B)); - - Mocking.waitForRegionFailedToCloseAndSetToPendingClose(am, REGIONINFO); - - // Now fake the region closing successfully over on the regionserver; the - // regionserver will have set the region in CLOSED state. This will - // trigger callback into AM. The below zk close call is from the RS close - // region handler duplicated here because its down deep in a private - // method hard to expose. - int versionid = - ZKAssign.transitionNodeClosed(this.watcher, REGIONINFO, SERVERNAME_A, -1); - assertNotSame(versionid, -1); - Mocking.waitForRegionPendingOpenInRIT(am, REGIONINFO.getEncodedName()); - - // Get current versionid else will fail on transition from OFFLINE to - // OPENING below - versionid = ZKAssign.getVersion(this.watcher, REGIONINFO); - assertNotSame(-1, versionid); - // This uglyness below is what the openregionhandler on RS side does. - versionid = ZKAssign.transitionNode(server.getZooKeeper(), REGIONINFO, - SERVERNAME_B, EventType.M_ZK_REGION_OFFLINE, - EventType.RS_ZK_REGION_OPENING, versionid); - assertNotSame(-1, versionid); - // Move znode from OPENING to OPENED as RS does on successful open. - versionid = ZKAssign.transitionNodeOpened(this.watcher, REGIONINFO, - SERVERNAME_B, versionid); - assertNotSame(-1, versionid); - am.gate.set(false); - // Block here until our znode is cleared or until this test times out. - ZKAssign.blockUntilNoRIT(watcher); - } finally { - am.getExecutorService().shutdown(); - am.shutdown(); - } - } - - @Test(timeout = 60000) - public void testBalanceOnMasterFailoverScenarioWithClosedNode() - throws IOException, KeeperException, InterruptedException, ServiceException, - DeserializationException, CoordinatedStateException { - AssignmentManagerWithExtrasForTesting am = - setUpMockedAssignmentManager(this.server, this.serverManager); - try { - createRegionPlanAndBalance(am, SERVERNAME_A, SERVERNAME_B, REGIONINFO); - startFakeFailedOverMasterAssignmentManager(am, this.watcher); - while (!am.processRITInvoked) Thread.sleep(1); - // As part of the failover cleanup, the balancing region plan is removed. - // So a random server will be used to open the region. For testing purpose, - // let's assume it is going to open on server b: - am.addPlan(REGIONINFO.getEncodedName(), new RegionPlan(REGIONINFO, null, SERVERNAME_B)); - - Mocking.waitForRegionFailedToCloseAndSetToPendingClose(am, REGIONINFO); - - // Now fake the region closing successfully over on the regionserver; the - // regionserver will have set the region in CLOSED state. This will - // trigger callback into AM. The below zk close call is from the RS close - // region handler duplicated here because its down deep in a private - // method hard to expose. - int versionid = - ZKAssign.transitionNodeClosed(this.watcher, REGIONINFO, SERVERNAME_A, -1); - assertNotSame(versionid, -1); - am.gate.set(false); - Mocking.waitForRegionPendingOpenInRIT(am, REGIONINFO.getEncodedName()); - - // Get current versionid else will fail on transition from OFFLINE to - // OPENING below - versionid = ZKAssign.getVersion(this.watcher, REGIONINFO); - assertNotSame(-1, versionid); - // This uglyness below is what the openregionhandler on RS side does. - versionid = ZKAssign.transitionNode(server.getZooKeeper(), REGIONINFO, - SERVERNAME_B, EventType.M_ZK_REGION_OFFLINE, - EventType.RS_ZK_REGION_OPENING, versionid); - assertNotSame(-1, versionid); - // Move znode from OPENING to OPENED as RS does on successful open. - versionid = ZKAssign.transitionNodeOpened(this.watcher, REGIONINFO, - SERVERNAME_B, versionid); - assertNotSame(-1, versionid); - - // Block here until our znode is cleared or until this test timesout. - ZKAssign.blockUntilNoRIT(watcher); - } finally { - am.getExecutorService().shutdown(); - am.shutdown(); - } - } - - @Test(timeout = 60000) - public void testBalanceOnMasterFailoverScenarioWithOfflineNode() - throws IOException, KeeperException, InterruptedException, ServiceException, - DeserializationException, CoordinatedStateException { - AssignmentManagerWithExtrasForTesting am = - setUpMockedAssignmentManager(this.server, this.serverManager); - try { - createRegionPlanAndBalance(am, SERVERNAME_A, SERVERNAME_B, REGIONINFO); - startFakeFailedOverMasterAssignmentManager(am, this.watcher); - while (!am.processRITInvoked) Thread.sleep(1); - // As part of the failover cleanup, the balancing region plan is removed. - // So a random server will be used to open the region. For testing purpose, - // let's assume it is going to open on server b: - am.addPlan(REGIONINFO.getEncodedName(), new RegionPlan(REGIONINFO, null, SERVERNAME_B)); - - Mocking.waitForRegionFailedToCloseAndSetToPendingClose(am, REGIONINFO); - - // Now fake the region closing successfully over on the regionserver; the - // regionserver will have set the region in CLOSED state. This will - // trigger callback into AM. The below zk close call is from the RS close - // region handler duplicated here because its down deep in a private - // method hard to expose. - int versionid = - ZKAssign.transitionNodeClosed(this.watcher, REGIONINFO, SERVERNAME_A, -1); - assertNotSame(versionid, -1); - Mocking.waitForRegionPendingOpenInRIT(am, REGIONINFO.getEncodedName()); - - am.gate.set(false); - // Get current versionid else will fail on transition from OFFLINE to - // OPENING below - versionid = ZKAssign.getVersion(this.watcher, REGIONINFO); - assertNotSame(-1, versionid); - // This uglyness below is what the openregionhandler on RS side does. - versionid = ZKAssign.transitionNode(server.getZooKeeper(), REGIONINFO, - SERVERNAME_B, EventType.M_ZK_REGION_OFFLINE, - EventType.RS_ZK_REGION_OPENING, versionid); - assertNotSame(-1, versionid); - // Move znode from OPENING to OPENED as RS does on successful open. - versionid = ZKAssign.transitionNodeOpened(this.watcher, REGIONINFO, - SERVERNAME_B, versionid); - assertNotSame(-1, versionid); - // Block here until our znode is cleared or until this test timesout. - ZKAssign.blockUntilNoRIT(watcher); - } finally { - am.getExecutorService().shutdown(); - am.shutdown(); - } - } - - private void createRegionPlanAndBalance( - final AssignmentManager am, final ServerName from, - final ServerName to, final HRegionInfo hri) throws RegionException { - // Call the balance function but fake the region being online first at - // servername from. - am.regionOnline(hri, from); - // Balance region from 'from' to 'to'. It calls unassign setting CLOSING state - // up in zk. Create a plan and balance - am.balance(new RegionPlan(hri, from, to)); - } - - /** - * Tests AssignmentManager balance function. Runs a balance moving a region - * from one server to another mocking regionserver responding over zk. - * @throws IOException - * @throws KeeperException - * @throws DeserializationException - */ - @Test - public void testBalance() throws IOException, KeeperException, DeserializationException, - InterruptedException, CoordinatedStateException { - // Create and startup an executor. This is used by AssignmentManager - // handling zk callbacks. - ExecutorService executor = startupMasterExecutor("testBalanceExecutor"); - - // We need a mocked catalog tracker. - LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(server - .getConfiguration()); - // Create an AM. - AssignmentManager am = new AssignmentManager(this.server, - this.serverManager, balancer, executor, null, master.getTableLockManager()); - am.failoverCleanupDone.set(true); - try { - // Make sure our new AM gets callbacks; once registered, can't unregister. - // Thats ok because we make a new zk watcher for each test. - this.watcher.registerListenerFirst(am); - // Call the balance function but fake the region being online first at - // SERVERNAME_A. Create a balance plan. - am.regionOnline(REGIONINFO, SERVERNAME_A); - // Balance region from A to B. - RegionPlan plan = new RegionPlan(REGIONINFO, SERVERNAME_A, SERVERNAME_B); - am.balance(plan); - - RegionStates regionStates = am.getRegionStates(); - // Must be failed to close since the server is fake - assertTrue(regionStates.isRegionInTransition(REGIONINFO) - && regionStates.isRegionInState(REGIONINFO, State.FAILED_CLOSE)); - // Move it back to pending_close - regionStates.updateRegionState(REGIONINFO, State.PENDING_CLOSE); - - // Now fake the region closing successfully over on the regionserver; the - // regionserver will have set the region in CLOSED state. This will - // trigger callback into AM. The below zk close call is from the RS close - // region handler duplicated here because its down deep in a private - // method hard to expose. - int versionid = - ZKAssign.transitionNodeClosed(this.watcher, REGIONINFO, SERVERNAME_A, -1); - assertNotSame(versionid, -1); - // AM is going to notice above CLOSED and queue up a new assign. The - // assign will go to open the region in the new location set by the - // balancer. The zk node will be OFFLINE waiting for regionserver to - // transition it through OPENING, OPENED. Wait till we see the OFFLINE - // zk node before we proceed. - Mocking.waitForRegionPendingOpenInRIT(am, REGIONINFO.getEncodedName()); - - // Get current versionid else will fail on transition from OFFLINE to OPENING below - versionid = ZKAssign.getVersion(this.watcher, REGIONINFO); - assertNotSame(-1, versionid); - // This uglyness below is what the openregionhandler on RS side does. - versionid = ZKAssign.transitionNode(server.getZooKeeper(), REGIONINFO, - SERVERNAME_B, EventType.M_ZK_REGION_OFFLINE, - EventType.RS_ZK_REGION_OPENING, versionid); - assertNotSame(-1, versionid); - // Move znode from OPENING to OPENED as RS does on successful open. - versionid = - ZKAssign.transitionNodeOpened(this.watcher, REGIONINFO, SERVERNAME_B, versionid); - assertNotSame(-1, versionid); - // Wait on the handler removing the OPENED znode. - while(regionStates.isRegionInTransition(REGIONINFO)) Threads.sleep(1); - } finally { - executor.shutdown(); - am.shutdown(); - // Clean up all znodes - ZKAssign.deleteAllNodes(this.watcher); - } - } - - /** - * Run a simple server shutdown handler. - * @throws KeeperException - * @throws IOException - */ - @Test - public void testShutdownHandler() - throws KeeperException, IOException, CoordinatedStateException, ServiceException { - // Create and startup an executor. This is used by AssignmentManager - // handling zk callbacks. - ExecutorService executor = startupMasterExecutor("testShutdownHandler"); - - // Create an AM. - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager( - this.server, this.serverManager); - try { - processServerShutdownHandler(am, false); - } finally { - executor.shutdown(); - am.shutdown(); - // Clean up all znodes - ZKAssign.deleteAllNodes(this.watcher); - } - } - - /** - * To test closed region handler to remove rit and delete corresponding znode - * if region in pending close or closing while processing shutdown of a region - * server.(HBASE-5927). - * - * @throws KeeperException - * @throws IOException - * @throws ServiceException - */ - @Test - public void testSSHWhenDisableTableInProgress() throws KeeperException, IOException, - CoordinatedStateException, ServiceException { - testCaseWithPartiallyDisabledState(Table.State.DISABLING); - testCaseWithPartiallyDisabledState(Table.State.DISABLED); - } - - - /** - * To test if the split region is removed from RIT if the region was in SPLITTING state but the RS - * has actually completed the splitting in hbase:meta but went down. See HBASE-6070 and also HBASE-5806 - * - * @throws KeeperException - * @throws IOException - */ - @Test - public void testSSHWhenSplitRegionInProgress() throws KeeperException, IOException, Exception { - // true indicates the region is split but still in RIT - testCaseWithSplitRegionPartial(true); - // false indicate the region is not split - testCaseWithSplitRegionPartial(false); - } - - private void testCaseWithSplitRegionPartial(boolean regionSplitDone) throws KeeperException, - IOException, InterruptedException, - CoordinatedStateException, ServiceException { - // Create and startup an executor. This is used by AssignmentManager - // handling zk callbacks. - ExecutorService executor = startupMasterExecutor("testSSHWhenSplitRegionInProgress"); - // We need a mocked catalog tracker. - ZKAssign.deleteAllNodes(this.watcher); - - // Create an AM. - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager( - this.server, this.serverManager); - // adding region to regions and servers maps. - am.regionOnline(REGIONINFO, SERVERNAME_A); - // adding region in pending close. - am.getRegionStates().updateRegionState( - REGIONINFO, State.SPLITTING, SERVERNAME_A); - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.ENABLED); - RegionTransition data = RegionTransition.createRegionTransition(EventType.RS_ZK_REGION_SPLITTING, - REGIONINFO.getRegionName(), SERVERNAME_A); - String node = ZKAssign.getNodeName(this.watcher, REGIONINFO.getEncodedName()); - // create znode in M_ZK_REGION_CLOSING state. - ZKUtil.createAndWatch(this.watcher, node, data.toByteArray()); - - try { - processServerShutdownHandler(am, regionSplitDone); - // check znode deleted or not. - // In both cases the znode should be deleted. - - if (regionSplitDone) { - assertFalse("Region state of region in SPLITTING should be removed from rit.", - am.getRegionStates().isRegionsInTransition()); - } else { - while (!am.assignInvoked) { - Thread.sleep(1); - } - assertTrue("Assign should be invoked.", am.assignInvoked); - } - } finally { - REGIONINFO.setOffline(false); - REGIONINFO.setSplit(false); - executor.shutdown(); - am.shutdown(); - // Clean up all znodes - ZKAssign.deleteAllNodes(this.watcher); - } - } - - private void testCaseWithPartiallyDisabledState(Table.State state) throws KeeperException, - IOException, CoordinatedStateException, ServiceException { - // Create and startup an executor. This is used by AssignmentManager - // handling zk callbacks. - ExecutorService executor = startupMasterExecutor("testSSHWhenDisableTableInProgress"); - LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(server.getConfiguration()); - ZKAssign.deleteAllNodes(this.watcher); - - // Create an AM. - AssignmentManager am = new AssignmentManager(this.server, - this.serverManager, balancer, executor, null, master.getTableLockManager()); - // adding region to regions and servers maps. - am.regionOnline(REGIONINFO, SERVERNAME_A); - // adding region in pending close. - am.getRegionStates().updateRegionState(REGIONINFO, State.PENDING_CLOSE); - if (state == Table.State.DISABLING) { - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.DISABLING); - } else { - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.DISABLED); - } - RegionTransition data = RegionTransition.createRegionTransition(EventType.M_ZK_REGION_CLOSING, - REGIONINFO.getRegionName(), SERVERNAME_A); - // RegionTransitionData data = new - // RegionTransitionData(EventType.M_ZK_REGION_CLOSING, - // REGIONINFO.getRegionName(), SERVERNAME_A); - String node = ZKAssign.getNodeName(this.watcher, REGIONINFO.getEncodedName()); - // create znode in M_ZK_REGION_CLOSING state. - ZKUtil.createAndWatch(this.watcher, node, data.toByteArray()); - - try { - processServerShutdownHandler(am, false); - // check znode deleted or not. - // In both cases the znode should be deleted. - assertTrue("The znode should be deleted.", ZKUtil.checkExists(this.watcher, node) == -1); - // check whether in rit or not. In the DISABLING case also the below - // assert will be true but the piece of code added for HBASE-5927 will not - // do that. - if (state == Table.State.DISABLED) { - assertFalse("Region state of region in pending close should be removed from rit.", - am.getRegionStates().isRegionsInTransition()); - } - } finally { - am.setEnabledTable(REGIONINFO.getTable()); - executor.shutdown(); - am.shutdown(); - // Clean up all znodes - ZKAssign.deleteAllNodes(this.watcher); - } - } - - private void processServerShutdownHandler(AssignmentManager am, boolean splitRegion) - throws IOException, ServiceException { - // Make sure our new AM gets callbacks; once registered, can't unregister. - // Thats ok because we make a new zk watcher for each test. - this.watcher.registerListenerFirst(am); - - // Need to set up a fake scan of meta for the servershutdown handler - // Make an RS Interface implementation. Make it so a scanner can go against it. - ClientProtos.ClientService.BlockingInterface implementation = - Mockito.mock(ClientProtos.ClientService.BlockingInterface.class); - // Get a meta row result that has region up on SERVERNAME_A - - Result r; - if (splitRegion) { - r = MetaMockingUtil.getMetaTableRowResultAsSplitRegion(REGIONINFO, SERVERNAME_A); - } else { - r = MetaMockingUtil.getMetaTableRowResult(REGIONINFO, SERVERNAME_A); - } - - final ScanResponse.Builder builder = ScanResponse.newBuilder(); - builder.setMoreResults(true); - builder.addCellsPerResult(r.size()); - final List<CellScannable> cellScannables = new ArrayList<CellScannable>(1); - cellScannables.add(r); - Mockito.when(implementation.scan( - (RpcController)Mockito.any(), (ScanRequest)Mockito.any())). - thenAnswer(new Answer<ScanResponse>() { - @Override - public ScanResponse answer(InvocationOnMock invocation) throws Throwable { - PayloadCarryingRpcController controller = (PayloadCarryingRpcController) invocation - .getArguments()[0]; - if (controller != null) { - controller.setCellScanner(CellUtil.createCellScanner(cellScannables)); - } - return builder.build(); - } - }); - - // Get a connection w/ mocked up common methods. - HConnection connection = - HConnectionTestingUtility.getMockedConnectionAndDecorate(HTU.getConfiguration(), - null, implementation, SERVERNAME_B, REGIONINFO); - - // Make it so we can get a catalogtracker from servermanager.. .needed - // down in guts of server shutdown handler. - Mockito.when(this.server.getShortCircuitConnection()).thenReturn(connection); - - // Now make a server shutdown handler instance and invoke process. - // Have it that SERVERNAME_A died. - DeadServer deadServers = new DeadServer(); - deadServers.add(SERVERNAME_A); - // I need a services instance that will return the AM - MasterFileSystem fs = Mockito.mock(MasterFileSystem.class); - Mockito.doNothing().when(fs).setLogRecoveryMode(); - Mockito.when(fs.getLogRecoveryMode()).thenReturn(RecoveryMode.LOG_REPLAY); - MasterServices services = Mockito.mock(MasterServices.class); - Mockito.when(services.getAssignmentManager()).thenReturn(am); - Mockito.when(services.getServerManager()).thenReturn(this.serverManager); - Mockito.when(services.getZooKeeper()).thenReturn(this.watcher); - Mockito.when(services.getMasterFileSystem()).thenReturn(fs); - ServerShutdownHandler handler = new ServerShutdownHandler(this.server, - services, deadServers, SERVERNAME_A, false); - am.failoverCleanupDone.set(true); - handler.process(); - // The region in r will have been assigned. It'll be up in zk as unassigned. - } - - /** - * Create and startup executor pools. Start same set as master does (just - * run a few less). - * @param name Name to give our executor - * @return Created executor (be sure to call shutdown when done). - */ - private ExecutorService startupMasterExecutor(final String name) { - // TODO: Move up into HBaseTestingUtility? Generally useful. - ExecutorService executor = new ExecutorService(name); - executor.startExecutorService(ExecutorType.MASTER_OPEN_REGION, 3); - executor.startExecutorService(ExecutorType.MASTER_CLOSE_REGION, 3); - executor.startExecutorService(ExecutorType.MASTER_SERVER_OPERATIONS, 3); - executor.startExecutorService(ExecutorType.MASTER_META_SERVER_OPERATIONS, 3); - return executor; - } - - @Test - public void testUnassignWithSplitAtSameTime() throws KeeperException, - IOException, CoordinatedStateException { - // Region to use in test. - final HRegionInfo hri = HRegionInfo.FIRST_META_REGIONINFO; - // First amend the servermanager mock so that when we do send close of the - // first meta region on SERVERNAME_A, it will return true rather than - // default null. - Mockito.when(this.serverManager.sendRegionClose(SERVERNAME_A, hri, -1)).thenReturn(true); - // Need a mocked catalog tracker. - LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(server - .getConfiguration()); - // Create an AM. - AssignmentManager am = new AssignmentManager(this.server, - this.serverManager, balancer, null, null, master.getTableLockManager()); - try { - // First make sure my mock up basically works. Unassign a region. - unassign(am, SERVERNAME_A, hri); - // This delete will fail if the previous unassign did wrong thing. - ZKAssign.deleteClosingNode(this.watcher, hri, SERVERNAME_A); - // Now put a SPLITTING region in the way. I don't have to assert it - // go put in place. This method puts it in place then asserts it still - // owns it by moving state from SPLITTING to SPLITTING. - int version = createNodeSplitting(this.watcher, hri, SERVERNAME_A); - // Now, retry the unassign with the SPLTTING in place. It should just - // complete without fail; a sort of 'silent' recognition that the - // region to unassign has been split and no longer exists: TOOD: what if - // the split fails and the parent region comes back to life? - unassign(am, SERVERNAME_A, hri); - // This transition should fail if the znode has been messed with. - ZKAssign.transitionNode(this.watcher, hri, SERVERNAME_A, - EventType.RS_ZK_REGION_SPLITTING, EventType.RS_ZK_REGION_SPLITTING, version); - assertFalse(am.getRegionStates().isRegionInTransition(hri)); - } finally { - am.shutdown(); - } - } - - /** - * Tests the processDeadServersAndRegionsInTransition should not fail with NPE - * when it failed to get the children. Let's abort the system in this - * situation - * @throws ServiceException - */ - @Test(timeout = 60000) - public void testProcessDeadServersAndRegionsInTransitionShouldNotFailWithNPE() - throws IOException, KeeperException, CoordinatedStateException, - InterruptedException, ServiceException { - final RecoverableZooKeeper recoverableZk = Mockito - .mock(RecoverableZooKeeper.class); - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager( - this.server, this.serverManager); - Watcher zkw = new ZooKeeperWatcher(HBaseConfiguration.create(), "unittest", - null) { - @Override - public RecoverableZooKeeper getRecoverableZooKeeper() { - return recoverableZk; - } - }; - ((ZooKeeperWatcher) zkw).registerListener(am); - Mockito.doThrow(new InterruptedException()).when(recoverableZk) - .getChildren("/hbase/region-in-transition", null); - am.setWatcher((ZooKeeperWatcher) zkw); - try { - am.processDeadServersAndRegionsInTransition(null); - fail("Expected to abort"); - } catch (NullPointerException e) { - fail("Should not throw NPE"); - } catch (RuntimeException e) { - assertEquals("Aborted", e.getLocalizedMessage()); - } - } - /** - * TestCase verifies that the regionPlan is updated whenever a region fails to open - * and the master tries to process RS_ZK_FAILED_OPEN state.(HBASE-5546). - */ - @Test(timeout = 60000) - public void testRegionPlanIsUpdatedWhenRegionFailsToOpen() throws IOException, KeeperException, - ServiceException, InterruptedException, CoordinatedStateException { - this.server.getConfiguration().setClass( - HConstants.HBASE_MASTER_LOADBALANCER_CLASS, MockedLoadBalancer.class, - LoadBalancer.class); - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager( - this.server, this.serverManager); - try { - // Boolean variable used for waiting until randomAssignment is called and - // new - // plan is generated. - AtomicBoolean gate = new AtomicBoolean(false); - if (balancer instanceof MockedLoadBalancer) { - ((MockedLoadBalancer) balancer).setGateVariable(gate); - } - ZKAssign.createNodeOffline(this.watcher, REGIONINFO, SERVERNAME_A); - int v = ZKAssign.getVersion(this.watcher, REGIONINFO); - ZKAssign.transitionNode(this.watcher, REGIONINFO, SERVERNAME_A, - EventType.M_ZK_REGION_OFFLINE, EventType.RS_ZK_REGION_FAILED_OPEN, v); - String path = ZKAssign.getNodeName(this.watcher, REGIONINFO - .getEncodedName()); - am.getRegionStates().updateRegionState( - REGIONINFO, State.OPENING, SERVERNAME_A); - // a dummy plan inserted into the regionPlans. This plan is cleared and - // new one is formed - am.regionPlans.put(REGIONINFO.getEncodedName(), new RegionPlan( - REGIONINFO, null, SERVERNAME_A)); - RegionPlan regionPlan = am.regionPlans.get(REGIONINFO.getEncodedName()); - List<ServerName> serverList = new ArrayList<ServerName>(2); - serverList.add(SERVERNAME_B); - Mockito.when( - this.serverManager.createDestinationServersList(SERVERNAME_A)) - .thenReturn(serverList); - am.nodeDataChanged(path); - // here we are waiting until the random assignment in the load balancer is - // called. - while (!gate.get()) { - Thread.sleep(10); - } - // new region plan may take some time to get updated after random - // assignment is called and - // gate is set to true. - RegionPlan newRegionPlan = am.regionPlans - .get(REGIONINFO.getEncodedName()); - while (newRegionPlan == null) { - Thread.sleep(10); - newRegionPlan = am.regionPlans.get(REGIONINFO.getEncodedName()); - } - // the new region plan created may contain the same RS as destination but - // it should - // be new plan. - assertNotSame("Same region plan should not come", regionPlan, - newRegionPlan); - assertTrue("Destination servers should be different.", !(regionPlan - .getDestination().equals(newRegionPlan.getDestination()))); - - Mocking.waitForRegionPendingOpenInRIT(am, REGIONINFO.getEncodedName()); - } finally { - this.server.getConfiguration().setClass( - HConstants.HBASE_MASTER_LOADBALANCER_CLASS, SimpleLoadBalancer.class, - LoadBalancer.class); - am.getExecutorService().shutdown(); - am.shutdown(); - } - } - - /** - * Mocked load balancer class used in the testcase to make sure that the testcase waits until - * random assignment is called and the gate variable is set to true. - */ - public static class MockedLoadBalancer extends SimpleLoadBalancer { - private AtomicBoolean gate; - - public void setGateVariable(AtomicBoolean gate) { - this.gate = gate; - } - - @Override - public ServerName randomAssignment(HRegionInfo regionInfo, List<ServerName> servers) { - ServerName randomServerName = super.randomAssignment(regionInfo, servers); - this.gate.set(true); - return randomServerName; - } - - @Override - public Map<ServerName, List<HRegionInfo>> retainAssignment( - Map<HRegionInfo, ServerName> regions, List<ServerName> servers) { - this.gate.set(true); - return super.retainAssignment(regions, servers); - } - } - - /** - * Test the scenario when the master is in failover and trying to process a - * region which is in Opening state on a dead RS. Master will force offline the - * region and put it in transition. AM relies on SSH to reassign it. - */ - @Test(timeout = 60000) - public void testRegionInOpeningStateOnDeadRSWhileMasterFailover() throws IOException, - KeeperException, ServiceException, CoordinatedStateException, InterruptedException { - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager( - this.server, this.serverManager); - ZKAssign.createNodeOffline(this.watcher, REGIONINFO, SERVERNAME_A); - int version = ZKAssign.getVersion(this.watcher, REGIONINFO); - ZKAssign.transitionNode(this.watcher, REGIONINFO, SERVERNAME_A, EventType.M_ZK_REGION_OFFLINE, - EventType.RS_ZK_REGION_OPENING, version); - RegionTransition rt = RegionTransition.createRegionTransition(EventType.RS_ZK_REGION_OPENING, - REGIONINFO.getRegionName(), SERVERNAME_A, HConstants.EMPTY_BYTE_ARRAY); - version = ZKAssign.getVersion(this.watcher, REGIONINFO); - Mockito.when(this.serverManager.isServerOnline(SERVERNAME_A)).thenReturn(false); - am.getRegionStates().logSplit(SERVERNAME_A); // Assume log splitting is done - am.getRegionStates().createRegionState(REGIONINFO); - am.gate.set(false); - - BaseCoordinatedStateManager cp = new ZkCoordinatedStateManager(); - cp.initialize(server); - cp.start(); - - OpenRegionCoordination orc = cp.getOpenRegionCoordination(); - ZkOpenRegionCoordination.ZkOpenRegionDetails zkOrd = - new ZkOpenRegionCoordination.ZkOpenRegionDetails(); - zkOrd.setServerName(server.getServerName()); - zkOrd.setVersion(version); - - assertFalse(am.processRegionsInTransition(rt, REGIONINFO, orc, zkOrd)); - am.getTableStateManager().setTableState(REGIONINFO.getTable(), Table.State.ENABLED); - processServerShutdownHandler(am, false); - // Waiting for the assignment to get completed. - while (!am.gate.get()) { - Thread.sleep(10); - } - assertTrue("The region should be assigned immediately.", null != am.regionPlans.get(REGIONINFO - .getEncodedName())); - } - - /** - * Test verifies whether assignment is skipped for regions of tables in DISABLING state during - * clean cluster startup. See HBASE-6281. - * - * @throws KeeperException - * @throws IOException - * @throws Exception - */ - @Test(timeout = 60000) - public void testDisablingTableRegionsAssignmentDuringCleanClusterStartup() - throws KeeperException, IOException, Exception { - this.server.getConfiguration().setClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, - MockedLoadBalancer.class, LoadBalancer.class); - Mockito.when(this.serverManager.getOnlineServers()).thenReturn( - new HashMap<ServerName, ServerLoad>(0)); - List<ServerName> destServers = new ArrayList<ServerName>(1); - destServers.add(SERVERNAME_A); - Mockito.when(this.serverManager.createDestinationServersList()).thenReturn(destServers); - // To avoid cast exception in DisableTableHandler process. - HTU.getConfiguration().setInt(HConstants.MASTER_PORT, 0); - - CoordinatedStateManager csm = CoordinatedStateManagerFactory.getCoordinatedStateManager( - HTU.getConfiguration()); - Server server = new HMaster(HTU.getConfiguration(), csm); - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager(server, - this.serverManager); - - Whitebox.setInternalState(server, "metaTableLocator", Mockito.mock(MetaTableLocator.class)); - - // Make it so we can get a catalogtracker from servermanager.. .needed - // down in guts of server shutdown handler. - Whitebox.setInternalState(server, "shortCircuitConnection", am.getConnection()); - - AtomicBoolean gate = new AtomicBoolean(false); - if (balancer instanceof MockedLoadBalancer) { - ((MockedLoadBalancer) balancer).setGateVariable(gate); - } - try{ - // set table in disabling state. - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.DISABLING); - am.joinCluster(); - // should not call retainAssignment if we get empty regions in assignAllUserRegions. - assertFalse( - "Assign should not be invoked for disabling table regions during clean cluster startup.", - gate.get()); - // need to change table state from disabling to disabled. - assertTrue("Table should be disabled.", - am.getTableStateManager().isTableState(REGIONINFO.getTable(), - Table.State.DISABLED)); - } finally { - this.server.getConfiguration().setClass( - HConstants.HBASE_MASTER_LOADBALANCER_CLASS, SimpleLoadBalancer.class, - LoadBalancer.class); - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.ENABLED); - am.shutdown(); - } - } - - /** - * Test verifies whether all the enabling table regions assigned only once during master startup. - * - * @throws KeeperException - * @throws IOException - * @throws Exception - */ - @Test - public void testMasterRestartWhenTableInEnabling() throws KeeperException, IOException, Exception { - enabling = true; - List<ServerName> destServers = new ArrayList<ServerName>(1); - destServers.add(SERVERNAME_A); - Mockito.when(this.serverManager.createDestinationServersList()).thenReturn(destServers); - Mockito.when(this.serverManager.isServerOnline(SERVERNAME_A)).thenReturn(true); - HTU.getConfiguration().setInt(HConstants.MASTER_PORT, 0); - CoordinatedStateManager csm = CoordinatedStateManagerFactory.getCoordinatedStateManager( - HTU.getConfiguration()); - Server server = new HMaster(HTU.getConfiguration(), csm); - Whitebox.setInternalState(server, "serverManager", this.serverManager); - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager(server, - this.serverManager); - - Whitebox.setInternalState(server, "metaTableLocator", Mockito.mock(MetaTableLocator.class)); - - // Make it so we can get a catalogtracker from servermanager.. .needed - // down in guts of server shutdown handler. - Whitebox.setInternalState(server, "shortCircuitConnection", am.getConnection()); - - try { - // set table in enabling state. - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.ENABLING); - new EnableTableHandler(server, REGIONINFO.getTable(), - am, new NullTableLockManager(), true).prepare() - .process(); - assertEquals("Number of assignments should be 1.", 1, assignmentCount); - assertTrue("Table should be enabled.", - am.getTableStateManager().isTableState(REGIONINFO.getTable(), - Table.State.ENABLED)); - } finally { - enabling = false; - assignmentCount = 0; - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.ENABLED); - am.shutdown(); - ZKAssign.deleteAllNodes(this.watcher); - } - } - - /** - * Test verifies whether stale znodes of unknown tables as for the hbase:meta will be removed or - * not. - * @throws KeeperException - * @throws IOException - * @throws Exception - */ - @Test - public void testMasterRestartShouldRemoveStaleZnodesOfUnknownTableAsForMeta() - throws Exception { - List<ServerName> destServers = new ArrayList<ServerName>(1); - destServers.add(SERVERNAME_A); - Mockito.when(this.serverManager.createDestinationServersList()).thenReturn(destServers); - Mockito.when(this.serverManager.isServerOnline(SERVERNAME_A)).thenReturn(true); - HTU.getConfiguration().setInt(HConstants.MASTER_PORT, 0); - CoordinatedStateManager csm = CoordinatedStateManagerFactory.getCoordinatedStateManager( - HTU.getConfiguration()); - Server server = new HMaster(HTU.getConfiguration(), csm); - Whitebox.setInternalState(server, "serverManager", this.serverManager); - AssignmentManagerWithExtrasForTesting am = setUpMockedAssignmentManager(server, - this.serverManager); - - Whitebox.setInternalState(server, "metaTableLocator", Mockito.mock(MetaTableLocator.class)); - - // Make it so we can get a catalogtracker from servermanager.. .needed - // down in guts of server shutdown handler. - Whitebox.setInternalState(server, "shortCircuitConnection", am.getConnection()); - - try { - TableName tableName = TableName.valueOf("dummyTable"); - // set table in enabling state. - am.getTableStateManager().setTableState(tableName, - Table.State.ENABLING); - am.joinCluster(); - assertFalse("Table should not be present in zookeeper.", - am.getTableStateManager().isTablePresent(tableName)); - } finally { - } - } - /** - * When a region is in transition, if the region server opening the region goes down, - * the region assignment takes a long time normally (waiting for timeout monitor to trigger assign). - * This test is to make sure SSH reassigns it right away. - */ - @Test - public void testSSHTimesOutOpeningRegionTransition() - throws KeeperException, IOException, CoordinatedStateException, ServiceException { - // Create an AM. - AssignmentManagerWithExtrasForTesting am = - setUpMockedAssignmentManager(this.server, this.serverManager); - // adding region in pending open. - RegionState state = new RegionState(REGIONINFO, - State.OPENING, System.currentTimeMillis(), SERVERNAME_A); - am.getRegionStates().regionOnline(REGIONINFO, SERVERNAME_B); - am.getRegionStates().regionsInTransition.put(REGIONINFO.getEncodedName(), state); - // adding region plan - am.regionPlans.put(REGIONINFO.getEncodedName(), - new RegionPlan(REGIONINFO, SERVERNAME_B, SERVERNAME_A)); - am.getTableStateManager().setTableState(REGIONINFO.getTable(), - Table.State.ENABLED); - - try { - am.assignInvoked = false; - processServerShutdownHandler(am, false); - assertTrue(am.assignInvoked); - } finally { - am.getRegionStates().regionsInTransition.remove(REGIONINFO.getEncodedName()); - am.regionPlans.remove(REGIONINFO.getEncodedName()); - } - } - - /** - * Scenario:<ul> - * <li> master starts a close, and creates a znode</li> - * <li> it fails just at this moment, before contacting the RS</li> - * <li> while the second master is coming up, the targeted RS dies. But it's before ZK timeout so - * we don't know, and we have an exception.</li> - * <li> the master must handle this nicely and reassign. - * </ul> - */ - @Test - public void testClosingFailureDuringRecovery() throws Exception { - - AssignmentManagerWithExtrasForTesting am = - setUpMockedAssignmentManager(this.server, this.serverManager); - ZKAssign.createNodeClosing(this.watcher, REGIONINFO, SERVERNAME_A); - am.getRegionStates().createRegionState(REGIONINFO); - - assertFalse( am.getRegionStates().isRegionsInTransition() ); - - am.processRegionInTransition(REGIONINFO.getEncodedName(), REGIONINFO); - - assertTrue( am.getRegionStates().isRegionsInTransition() ); - } - - /** - * Creates a new ephemeral node in the SPLITTING state for the specified region. - * Create it ephemeral in case regionserver dies mid-split. - * - * <p>Does not transition nodes from other states. If a node already exists - * for this region, a {@link NodeExistsException} will be thrown. - * - * @param zkw zk reference - * @param region region to be created as offline - * @param serverName server event originates from - * @return Version of znode created. - * @throws KeeperException - * @throws IOException - */ - // Copied from SplitTransaction rather than open the method over there in - // the regionserver package. - private static int createNodeSplitting(final ZooKeeperWatcher zkw, - final HRegionInfo region, final ServerName serverName) - throws KeeperException, IOException { - RegionTransition rt = - RegionTransition.createRegionTransition(EventType.RS_ZK_REGION_SPLITTING, - region.getRegionName(), serverName); - - String node = ZKAssign.getNodeName(zkw, region.getEncodedName()); - if (!ZKUtil.createEphemeralNodeAndWatch(zkw, node, rt.toByteArray())) { - throw new IOException("Failed create of ephemeral " + node); - } - // Transition node from SPLITTING to SPLITTING and pick up version so we - // can be sure this znode is ours; version is needed deleting. - return transitionNodeSplitting(zkw, region, serverName, -1); - } - - // Copied from SplitTransaction rather than open the method over there in - // the regionserver package. - private static int transitionNodeSplitting(final ZooKeeperWatcher zkw, - final HRegionInfo parent, - final ServerName serverName, final int version) - throws KeeperException, IOException { - return ZKAssign.transitionNode(zkw, parent, serverName, - EventType.RS_ZK_REGION_SPLITTING, EventType.RS_ZK_REGION_SPLITTING, version); - } - - private void unassign(final AssignmentManager am, final ServerName sn, - final HRegionInfo hri) throws RegionException { - // Before I can unassign a region, I need to set it online. - am.regionOnline(hri, sn); - // Unassign region. - am.unassign(hri); - } - - /** - * Create an {@link AssignmentManagerWithExtrasForTesting} that has mocked - * {@link CatalogTracker} etc. - * @param server - * @param manager - * @return An AssignmentManagerWithExtras with mock connections, etc. - * @throws IOException - * @throws KeeperException - */ - private AssignmentManagerWithExtrasForTesting setUpMockedAssignmentManager(final Server server, - final ServerManager manager) throws IOException, KeeperException, - ServiceException, CoordinatedStateException { - // Make an RS Interface implementation. Make it so a scanner can go against - // it and a get to return the single region, REGIONINFO, this test is - // messing with. Needed when "new master" joins cluster. AM will try and - // rebuild its list of user regions and it will also get the HRI that goes - // with an encoded name by doing a Get on hbase:meta - ClientProtos.ClientService.BlockingInterface ri = - Mockito.mock(ClientProtos.ClientService.BlockingInterface.class); - // Get a meta row result that has region up on SERVERNAME_A for REGIONINFO - Result r = MetaMockingUtil.getMetaTableRowResult(REGIONINFO, SERVERNAME_A); - final ScanResponse.Builder builder = ScanResponse.newBuilder(); - builder.setMoreResults(true); - builder.addCellsPerResult(r.size()); - final List<CellScannable> rows = new ArrayList<CellScannable>(1); - rows.add(r); - Answer<ScanResponse> ans = new Answer<ClientProtos.ScanResponse>() { - @Override - public ScanResponse answer(InvocationOnMock invocation) throws Throwable { - PayloadCarryingRpcController controller = (PayloadCarryingRpcController) invocation - .getArguments()[0]; - if (controller != null) { - controller.setCellScanner(CellUtil.createCellScanner(rows)); - } - return builder.build(); - } - }; - if (enabling) { - Mockito.when(ri.scan((RpcController) Mockito.any(), (ScanRequest) Mockito.any())) - .thenAnswer(ans).thenAnswer(ans).thenAnswer(ans).thenAnswer(ans).thenAnswer(ans) - .thenReturn(ScanResponse.newBuilder().setMoreResults(false).build()); - } else { - Mockito.when(ri.scan((RpcController) Mockito.any(), (ScanRequest) Mockito.any())).thenAnswer( - ans); - } - // If a get, return the above result too for REGIONINFO - GetResponse.Builder getBuilder = GetResponse.newBuilder(); - getBuilder.setResult(ProtobufUtil.toResult(r)); - Mockito.when(ri.get((RpcController)Mockito.any(), (GetRequest) Mockito.any())). - thenReturn(getBuilder.build()); - // Get a connection w/ mocked up common methods. - HConnection connection = HConnectionTestingUtility. - getMockedConnectionAndDecorate(HTU.getConfiguration(), null, - ri, SERVERNAME_B, REGIONINFO); - // Make it so we can get the connection from our mocked catalogtracker - // Create and startup an executor. Used by AM handling zk callbacks. - ExecutorService executor = startupMasterExecutor("mockedAMExecutor"); - this.balancer = LoadBalancerFactory.getLoadBalancer(server.getConfiguration()); - AssignmentManagerWithExtrasForTesting am = new AssignmentManagerWithExtrasForTesting( - server, connection, manager, this.balancer, executor, new NullTableLockManager()); - return am; - } - - /** - * An {@link AssignmentManager} with some extra facility used testing - */ - class AssignmentManagerWithExtrasForTesting extends AssignmentManager { - // Keep a reference so can give it out below in {@link #getExecutorService} - private final ExecutorService es; - boolean processRITInvoked = false; - boolean assignInvoked = false; - AtomicBoolean gate = new AtomicBoolean(true); - private HConnection connection; - - public AssignmentManagerWithExtrasForTesting( - final Server master, HConnection connection, final ServerManager serverManager, - final LoadBalancer balancer, - final ExecutorService service, final TableLockManager tableLockManager) - throws KeeperException, IOException, CoordinatedStateException { - super(master, serverManager, balancer, service, null, tableLockManager); - this.es = service; - this.connection = connection; - } - - @Override - boolean processRegionInTransition(String encodedRegionName, - HRegionInfo regionInfo) throws KeeperException, IOException { - this.processRITInvoked = true; - return super.processRegionInTransition(encodedRegionName, regionInfo); - } - - @Override - public void assign(HRegionInfo region, boolean setOfflineInZK, boolean forceNewPlan) { - if (enabling) { - assignmentCount++; - this.regionOnline(region, SERVERNAME_A); - } else { - super.assign(region, setOfflineInZK, forceNewPlan); - this.gate.set(true); - } - } - - @Override - boolean assign(ServerName destination, List<HRegionInfo> regions) - throws InterruptedException { - if (enabling) { - for (HRegionInfo region : regions) { - assignmentCount++; - this.regionOnline(region, SERVERNAME_A); - } - return true; - } - return super.assign(destination, regions); - } - - @Override - public void assign(List<HRegionInfo> regions) - throws IOException, InterruptedException { - assignInvoked = (regions != null && regions.size() > 0); - super.assign(regions); - this.gate.set(true); - } - - /** reset the watcher */ - void setWatcher(ZooKeeperWatcher watcher) { - this.watcher = watcher; - } - - /** - * @return ExecutorService used by this instance. - */ - ExecutorService getExecutorService() { - return this.es; - } - - /* - * Convenient method to retrieve mocked up connection - */ - HConnection getConnection() { - return this.connection; - } - } - - /** - * Call joinCluster on the passed AssignmentManager. Do it in a thread - * so it runs independent of what all else is going on. Try to simulate - * an AM running insided a failed over master by clearing all in-memory - * AM state first. - */ - private void startFakeFailedOverMasterAssignmentManager(final AssignmentManager am, - final ZooKeeperWatcher watcher) { - // Make sure our new AM gets callbacks; once registered, we can't unregister. - // Thats ok because we make a new zk watcher for each test. - watcher.registerListenerFirst(am); - Thread t = new Thread("RunAmJoinCluster") { - @Override - public void run() { - // Call the joinCluster function as though we were doing a master - // failover at this point. It will stall just before we go to add - // the RIT region to our RIT Map in AM at processRegionsInTransition. - // First clear any inmemory state from AM so it acts like a new master - // coming on line. - am.getRegionStates().regionsInTransition.clear(); - am.regionPlans.clear(); - try { - am.joinCluster(); - } catch (IOException e) { - throw new RuntimeException(e); - } catch (KeeperException e) { - throw new RuntimeException(e); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } catch (CoordinatedStateException e) { - throw new RuntimeException(e); - } - } - }; - t.start(); - while (!t.isAlive()) Threads.sleep(1); - } - - @Test - public void testForceAssignMergingRegion() throws Exception { - // Region to use in test. - final HRegionInfo hri = HRegionInfo.FIRST_META_REGIONINFO; - // Need a mocked catalog tracker. - LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer( - server.getConfiguration()); - // Create an AM. - AssignmentManager am = new AssignmentManager(this.server, - this.serverManager, balancer, null, null, master.getTableLockManager()); - RegionStates regionStates = am.getRegionStates(); - try { - // First set the state of the region to merging - regionStates.updateRegionState(hri, RegionState.State.MERGING); - // Now, try to assign it with force new plan - am.assign(hri, true, true); - assertEquals("The region should be still in merging state", - RegionState.State.MERGING, regionStates.getRegionState(hri).getState()); - } finally { - am.shutdown(); - } - } - - /** - * Test assignment related ZK events are ignored by AM if the region is not known - * by AM to be in transition. During normal operation, all assignments are started - * by AM (not considering split/merge), if an event is received but the region - * is not in transition, the event must be a very late one. So it can be ignored. - * During master failover, since AM watches assignment znodes after failover cleanup - * is completed, when an event comes in, AM should already have the region in transition - * if ZK is used during the assignment action (only hbck doesn't use ZK for region - * assignment). So during master failover, we can ignored such events too. - */ - @Test - public void testAssignmentEventIgnoredIfNotExpected() throws KeeperException, IOException, - CoordinatedStateException { - // Region to use in test. - final HRegionInfo hri = HRegionInfo.FIRST_META_REGIONINFO; - LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer( - server.getConfiguration()); - final AtomicBoolean zkEventProcessed = new AtomicBoolean(false); - // Create an AM. - AssignmentManager am = new AssignmentManager(this.server, - this.serverManager, balancer, null, null, master.getTableLockManager()) { - - @Override - void handleRegion(final RegionTransition rt, OpenRegionCoordination coordination, - OpenRegionCoordination.OpenRegionDetails ord) { - super.handleRegion(rt, coordination, ord); - if (rt != null && Bytes.equals(hri.getRegionName(), - rt.getRegionName()) && rt.getEventType() == EventType.RS_ZK_REGION_OPENING) { - zkEventProcessed.set(true); - } - } - }; - try { - // First make sure the region is not in transition - am.getRegionStates().regionOffline(hri); - zkEventProcessed.set(false); // Reset it before faking zk transition - this.watcher.registerListenerFirst(am); - assertFalse("The region should not be in transition", - am.getRegionStates().isRegionInTransition(hri)); - ZKAssign.createNodeOffline(this.watcher, hri, SERVERNAME_A); - // Trigger a transition event - ZKAssign.transitionNodeOpening(this.watcher, hri, SERVERNAME_A); - long startTime = EnvironmentEdgeManager.currentTimeMillis(); - while (!zkEventProcessed.get()) { - assertTrue("Timed out in waiting for ZK event to be processed", - EnvironmentEdgeManager.currentTimeMillis() - startTime < 30000); - Threads.sleepWithoutInterrupt(100); - } - assertFalse(am.getRegionStates().isRegionInTransition(hri)); - } finally { - am.shutdown(); - } - } - - /** - * If a table is deleted, we should not be able to balance it anymore. - * Otherwise, the region will be brought back. - * @throws Exception - */ - @Test - public void testBalanceRegionOfDeletedTable() throws Exception { - AssignmentManager am = new AssignmentManager(this.server, this.serverManager, - balancer, null, null, master.getTableLockManager()); - RegionStates regionStates = am.getRegionStates(); - HRegionInfo hri = REGIONINFO; - regionStates.createRegionState(hri); - assertFalse(regionStates.isRegionInTransition(hri)); - RegionPlan plan = new RegionPlan(hri, SERVERNAME_A, SERVERNAME_B); - // Fake table is deleted - regionStates.tableDeleted(hri.getTable()); - am.balance(plan); - assertFalse("The region should not in transition", - regionStates.isRegionInTransition(hri)); - } - - /** - * Tests an on-the-fly RPC that was scheduled for the earlier RS on the same port - * for openRegion. AM should assign this somewhere else. (HBASE-9721) - */ - @SuppressWarnings("unchecked") - @Test - public void testOpenCloseRegionRPCIntendedForPreviousServer() throws Exception { - Mockito.when(this.serverManager.sendRegionOpen(Mockito.eq(SERVERNAME_B), Mockito.eq(REGIONINFO), - Mockito.anyInt(), (List<ServerName>)Mockito.any())) - .thenThrow(new DoNotRetryIOException()); - this.server.getConfiguration().setInt("hbase.assignment.maximum.attempts", 100); - - HRegionInfo hri = REGIONINFO; - LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer( - server.getConfiguration()); - // Create an AM. - AssignmentManager am = new AssignmentManager(this.server, - this.serverManager, balancer, null, null, master.getTableLockManager()); - RegionStates regionStates = am.getRegionStates(); - try { - am.regionPlans.put(REGIONINFO.getEncodedName(), - new RegionPlan(REGIONINFO, null, SERVERNAME_B)); - - // Should fail once, but succeed on the second attempt for the SERVERNAME_A - am.assign(hri, true, false); - } finally { - assertEquals(SERVERNAME_A, regionStates.getRegionState(REGIONINFO).getServerName()); - } - } -}
http://git-wip-us.apache.org/repos/asf/hbase/blob/17dff681/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java index 989b9f9..469a5d2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManagerOnCluster.java @@ -40,6 +40,7 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.MediumTests; +import org.apache.hadoop.hbase.MetaTableAccessor; import org.apache.hadoop.hbase.MiniHBaseCluster; import org.apache.hadoop.hbase.MiniHBaseCluster.MiniHBaseClusterRegionServer; import org.apache.hadoop.hbase.ServerLoad; @@ -47,28 +48,22 @@ import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.UnknownRegionException; import org.apache.hadoop.hbase.Waiter; -import org.apache.hadoop.hbase.MetaTableAccessor; import org.apache.hadoop.hbase.client.Admin; -import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.RegionObserver; -import org.apache.hadoop.hbase.executor.EventType; import org.apache.hadoop.hbase.master.RegionState.State; import org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer; import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos; import org.apache.hadoop.hbase.regionserver.HRegionServer; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.hbase.util.ConfigUtil; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.JVMClusterUtil; import org.apache.hadoop.hbase.util.Threads; -import org.apache.hadoop.hbase.zookeeper.ZKAssign; -import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; import org.apache.zookeeper.KeeperException; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -85,7 +80,8 @@ public class TestAssignmentManagerOnCluster { final static Configuration conf = TEST_UTIL.getConfiguration(); private static Admin admin; - static void setupOnce() throws Exception { + @BeforeClass + public static void setUpBeforeClass() throws Exception { // Using the our load balancer to control region plans conf.setClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, MyLoadBalancer.class, LoadBalancer.class); @@ -98,13 +94,6 @@ public class TestAssignmentManagerOnCluster { admin = TEST_UTIL.getHBaseAdmin(); } - @BeforeClass - public static void setUpBeforeClass() throws Exception { - // Use ZK for region assignment - conf.setBoolean("hbase.assignment.usezk", true); - setupOnce(); - } - @AfterClass public static void tearDownAfterClass() throws Exception { TEST_UTIL.shutdownMiniCluster(); @@ -187,11 +176,6 @@ public class TestAssignmentManagerOnCluster { am.addPlan(hri.getEncodedName(), plan); master.assignRegion(hri); - int version = ZKAssign.transitionNode(master.getZooKeeper(), hri, - destServer, EventType.M_ZK_REGION_OFFLINE, - EventType.RS_ZK_REGION_OPENING, 0); - assertEquals("TansitionNode should fail", -1, version); - TEST_UTIL.waitFor(60000, new Waiter.Predicate<Exception>() { @Override public boolean evaluate() throws Exception { @@ -402,7 +386,7 @@ public class TestAssignmentManagerOnCluster { // region is closing now, will be re-assigned automatically. // now, let's forcefully assign it again. it should be // assigned properly and no double-assignment - am.assign(hri, true, true); + am.assign(hri, true); // let's check if it's assigned after it's out of transition am.waitOnRegionToClearRegionsInTransition(hri); @@ -572,20 +556,7 @@ public class TestAssignmentManagerOnCluster { } } am.regionOffline(hri); - ZooKeeperWatcher zkw = TEST_UTIL.getHBaseCluster().getMaster().getZooKeeper(); am.getRegionStates().updateRegionState(hri, State.PENDING_OPEN, destServerName); - if (ConfigUtil.useZKForAssignment(conf)) { - ZKAssign.createNodeOffline(zkw, hri, destServerName); - ZKAssign.transitionNodeOpening(zkw, hri, destServerName); - - // Wait till the event is processed and the region is in transition - long timeoutTime = System.currentTimeMillis() + 20000; - while (!am.getRegionStates().isRegionInTransition(hri)) { - assertTrue("Failed to process ZK opening event in time", - System.currentTimeMillis() < timeoutTime); - Thread.sleep(100); - } - } am.getTableStateManager().setTableState(table, ZooKeeperProtos.Table.State.DISABLING); List<HRegionInfo> toAssignRegions = am.processServerShutdown(destServerName); @@ -775,7 +746,7 @@ public class TestAssignmentManagerOnCluster { } // You can't assign a dead region before SSH - am.assign(hri, true, true); + am.assign(hri, true); RegionState state = regionStates.getRegionState(hri); assertTrue(state.isFailedClose()); @@ -833,7 +804,7 @@ public class TestAssignmentManagerOnCluster { assertTrue(regionStates.isRegionOffline(hri)); // You can't assign a disabled region - am.assign(hri, true, true); + am.assign(hri, true); assertTrue(regionStates.isRegionOffline(hri)); // You can't unassign a disabled region either @@ -991,7 +962,7 @@ public class TestAssignmentManagerOnCluster { } // Wait till no more RIT, the region should be offline. - am.waitUntilNoRegionsInTransition(60000); + TEST_UTIL.waitUntilNoRegionsInTransition(60000); assertTrue(regionStates.isRegionOffline(hri)); } finally { MyRegionServer.abortedServer = null; http://git-wip-us.apache.org/repos/asf/hbase/blob/17dff681/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestDistributedLogSplitting.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestDistributedLogSplitting.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestDistributedLogSplitting.java index 87c34be..5735eaa 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestDistributedLogSplitting.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestDistributedLogSplitting.java @@ -95,13 +95,11 @@ import org.apache.hadoop.hbase.util.JVMClusterUtil.MasterThread; import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread; import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.hbase.zookeeper.MiniZooKeeperCluster; -import org.apache.hadoop.hbase.zookeeper.ZKAssign; import org.apache.hadoop.hbase.zookeeper.ZKUtil; import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.apache.zookeeper.KeeperException; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; @@ -1505,10 +1503,8 @@ public class TestDistributedLogSplitting { return count; } - private void blockUntilNoRIT(ZooKeeperWatcher zkw, HMaster master) - throws KeeperException, InterruptedException { - ZKAssign.blockUntilNoRIT(zkw); - master.assignmentManager.waitUntilNoRegionsInTransition(60000); + private void blockUntilNoRIT(ZooKeeperWatcher zkw, HMaster master) throws Exception { + TEST_UTIL.waitUntilNoRegionsInTransition(60000); } private void putData(HRegion region, byte[] startRow, int numRows, byte [] qf, http://git-wip-us.apache.org/repos/asf/hbase/blob/17dff681/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMaster.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMaster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMaster.java index 6bfb618..dc45b26 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMaster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMaster.java @@ -18,28 +18,39 @@ */ package org.apache.hadoop.hbase.master; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.*; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.MediumTests; import org.apache.hadoop.hbase.MetaTableAccessor; +import org.apache.hadoop.hbase.MiniHBaseCluster; +import org.apache.hadoop.hbase.PleaseHoldException; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.UnknownRegionException; import org.apache.hadoop.hbase.client.Admin; -import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; - -import java.io.IOException; -import java.util.List; - import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; - -import com.google.common.base.Joiner; import org.junit.experimental.categories.Category; -import static org.junit.Assert.*; +import com.google.common.base.Joiner; @Category(MediumTests.class) public class TestMaster { @@ -55,7 +66,6 @@ public class TestMaster { // Start a cluster of two regionservers. TEST_UTIL.startMiniCluster(2); admin = TEST_UTIL.getHBaseAdmin(); - TEST_UTIL.getHBaseCluster().getMaster().assignmentManager.initializeHandlerTrackers(); } @AfterClass @@ -64,6 +74,7 @@ public class TestMaster { } @Test + @SuppressWarnings("deprecation") public void testMasterOpsWhileSplitting() throws Exception { MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster(); HMaster m = cluster.getMaster();
