diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 3f93921f404d..5bfda15a2466 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -1104,7 +1104,9 @@ private void finishActiveMasterInitialization(MonitoredTask status) throws IOExc this.clusterStatusChore = new ClusterStatusChore(this, balancer); getChoreService().scheduleChore(clusterStatusChore); this.balancerChore = new BalancerChore(this); - getChoreService().scheduleChore(balancerChore); + if (this.loadBalancerTracker.isBalancerOn()) { + getChoreService().scheduleChore(balancerChore); + } this.normalizerChore = new RegionNormalizerChore(this); getChoreService().scheduleChore(normalizerChore); this.catalogJanitorChore = new CatalogJanitor(this); @@ -1673,6 +1675,29 @@ private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransi if (interrupted) Thread.currentThread().interrupt(); } + /** + * Turn the balancer on/off + * + * @param on boolean value indicates whether to turn the balancer on + */ + void switchBalancer(boolean on) { + if (on) { + scheduleBalancerChore(); + } else { + cancelBalancerChore(); + } + } + + private synchronized void scheduleBalancerChore() { + if (!getChoreService().isChoreScheduled(this.balancerChore)) { + getChoreService().scheduleChore(this.balancerChore); + } + } + + private void cancelBalancerChore() { + getChoreService().cancelChore(this.balancerChore); + } + public boolean balance() throws IOException { return balance(false); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index e55a39dc784a..698ccbfbdf10 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -447,9 +447,11 @@ boolean switchBalancer(final boolean b, BalanceSwitchMode mode) throws IOExcepti if (mode == BalanceSwitchMode.SYNC) { synchronized (master.getLoadBalancer()) { master.loadBalancerTracker.setBalancerOn(newValue); + master.switchBalancer(newValue); } } else { master.loadBalancerTracker.setBalancerOn(newValue); + master.switchBalancer(newValue); } } catch (KeeperException ke) { throw new IOException(ke); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java index 28e60d2f9576..16b0bafd6ca1 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java @@ -173,7 +173,6 @@ public void testMoveRegion() throws Exception { } Thread.sleep(100); } - admin.balancerSwitch(true).join(); } @Test diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java index 88c3dffcac27..78458e70279e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java @@ -224,7 +224,6 @@ public void testRITStateForRollback() throws Exception { } assertTrue(cluster.getMaster().getAssignmentManager().getRegionStates().isRegionOnline(hri)); } finally { - admin.balancerSwitch(true, false); master.setCatalogJanitorEnabled(true); abortAndWaitForMaster(); TESTING_UTIL.deleteTable(tableName); @@ -346,7 +345,6 @@ public void testSplitRollbackOnRegionClosing() throws Exception { checkAndGetDaughters(tableName); // OK, so split happened after we cleared the blocking node. } finally { - admin.balancerSwitch(true, false); cluster.getMaster().setCatalogJanitorEnabled(true); t.close(); } @@ -423,7 +421,6 @@ public void testShutdownFixupWhenDaughterHasSplit() throws Exception { } } finally { LOG.info("EXITING"); - admin.balancerSwitch(true, false); cluster.getMaster().setCatalogJanitorEnabled(true); t.close(); } @@ -549,7 +546,6 @@ public void testMasterRestartAtRegionSplitPendingCatalogJanitor() ServerName regionServerOfRegion = regionStates.getRegionServerOfRegion(hri); assertEquals(null, regionServerOfRegion); } finally { - TESTING_UTIL.getAdmin().balancerSwitch(true, false); cluster.getMaster().setCatalogJanitorEnabled(true); } } @@ -621,7 +617,6 @@ public void testSplitWithRegionReplicas() throws Exception { SlowMeCopro.getPrimaryCdl().get().countDown(); } finally { SlowMeCopro.getPrimaryCdl().get().countDown(); - admin.balancerSwitch(true, false); cluster.getMaster().setCatalogJanitorEnabled(true); t.close(); } @@ -730,7 +725,6 @@ public void testSplitRegionWithNoStoreFiles() throws Exception { assertFalse("Split region can't be unassigned", regionStates.isRegionInTransition(hri)); assertTrue(regionStates.isRegionInState(hri, State.SPLIT)); } finally { - admin.balancerSwitch(true, false); cluster.getMaster().setCatalogJanitorEnabled(true); } }