From cdaa133266689be2da067451e00afd6d4402d75a Mon Sep 17 00:00:00 2001 From: Viraj Jasani Date: Fri, 9 Aug 2019 00:53:59 +0530 Subject: [PATCH 1/4] HBASE-22822 : Un/Re-schedule balancer chore with balance_switch --- .../apache/hadoop/hbase/master/HMaster.java | 23 +++++++++++++++++++ .../hbase/master/MasterRpcServices.java | 2 ++ 2 files changed, 25 insertions(+) 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..18c4b3d8408d 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 @@ -1673,6 +1673,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 turnBalancer(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..9e9aaea4494d 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.turnBalancer(newValue); } } else { master.loadBalancerTracker.setBalancerOn(newValue); + master.turnBalancer(newValue); } } catch (KeeperException ke) { throw new IOException(ke); From 472ab759a159729154a16cd5a3039b0da31967cb Mon Sep 17 00:00:00 2001 From: Viraj Jasani Date: Fri, 9 Aug 2019 13:05:10 +0530 Subject: [PATCH 2/4] active master to schedule balancer chore conditionally --- .../main/java/org/apache/hadoop/hbase/master/HMaster.java | 4 +++- .../hbase/regionserver/TestSplitTransactionOnCluster.java | 6 ------ 2 files changed, 3 insertions(+), 7 deletions(-) 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 18c4b3d8408d..a398d74788b0 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); 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); } } From 0ee0213b978ee0a33dd867db663347d26effe3df Mon Sep 17 00:00:00 2001 From: Viraj Jasani Date: Fri, 9 Aug 2019 18:18:04 +0530 Subject: [PATCH 3/4] do not trigger balancer immediately --- .../org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java | 1 - 1 file changed, 1 deletion(-) 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 From e94ab72b54e96da3be37d2187b3d7aa16b2bd0ff Mon Sep 17 00:00:00 2001 From: Viraj Jasani Date: Sun, 11 Aug 2019 22:58:12 +0530 Subject: [PATCH 4/4] s/turnBalancer/switchBalancer/ --- .../src/main/java/org/apache/hadoop/hbase/master/HMaster.java | 2 +- .../org/apache/hadoop/hbase/master/MasterRpcServices.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 a398d74788b0..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 @@ -1680,7 +1680,7 @@ private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransi * * @param on boolean value indicates whether to turn the balancer on */ - void turnBalancer(boolean on) { + void switchBalancer(boolean on) { if (on) { scheduleBalancerChore(); } else { 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 9e9aaea4494d..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,11 +447,11 @@ boolean switchBalancer(final boolean b, BalanceSwitchMode mode) throws IOExcepti if (mode == BalanceSwitchMode.SYNC) { synchronized (master.getLoadBalancer()) { master.loadBalancerTracker.setBalancerOn(newValue); - master.turnBalancer(newValue); + master.switchBalancer(newValue); } } else { master.loadBalancerTracker.setBalancerOn(newValue); - master.turnBalancer(newValue); + master.switchBalancer(newValue); } } catch (KeeperException ke) { throw new IOException(ke);