Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1172559) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -876,24 +876,49 @@ return balancerRan; } - @Override - public boolean balanceSwitch(final boolean b) { + enum BalanceSwitchMode { + SYNC, + ASYNC + } + /** + * Assigns balancer switch according to BalanceSwitchMode + * @param b new balancer switch + * @param mode BalanceSwitchMode + * @return old balancer switch + */ + public boolean switchBalancer(final boolean b, BalanceSwitchMode mode) { boolean oldValue = this.balanceSwitch; boolean newValue = b; try { if (this.cpHost != null) { newValue = this.cpHost.preBalanceSwitch(newValue); } - this.balanceSwitch = newValue; - LOG.info("Balance=" + newValue); + if (mode == BalanceSwitchMode.SYNC) { + synchronized (this.balancer) { + this.balanceSwitch = newValue; + } + } else { + this.balanceSwitch = newValue; + } + LOG.info("BalanceSwitch=" + newValue); if (this.cpHost != null) { this.cpHost.postBalanceSwitch(oldValue, newValue); } } catch (IOException ioe) { LOG.warn("Error flipping balance switch", ioe); } - return oldValue; + return oldValue; } + + @Override + public boolean synchronousBalanceSwitch(final boolean b) { + return switchBalancer(b, BalanceSwitchMode.SYNC); + } + + @Override + public boolean balanceSwitch(final boolean b) { + return switchBalancer(b, BalanceSwitchMode.ASYNC); + } /** * Switch for the background {@link CatalogJanitor} thread. Index: src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java (revision 1172559) +++ src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java (working copy) @@ -231,6 +231,14 @@ public boolean balanceSwitch(final boolean b); /** + * Turn the load balancer on or off. + * It waits until current balance() call, if outstanding, to return. + * @param b If true, enable balancer. If false, disable balancer. + * @return Previous balancer value + */ + public boolean synchronousBalanceSwitch(final boolean b); + + /** * Get array of all HTDs. * @return array of HTableDescriptor */