Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1082962) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -172,6 +172,8 @@ private LogCleaner logCleaner; private MasterCoprocessorHost cpHost; + + static int balancerPeriod; /** * Initializes the HMaster. The steps are as follows: @@ -593,9 +595,9 @@ private static Thread getAndStartBalancerChore(final HMaster master) { String name = master.getServerName() + "-BalancerChore"; - int period = master.getConfiguration().getInt("hbase.balancer.period", 300000); + balancerPeriod = master.getConfiguration().getInt("hbase.balancer.period", 300000); // Start up the load balancer chore - Chore chore = new Chore(name, period, master) { + Chore chore = new Chore(name, balancerPeriod, master) { @Override protected void chore() { master.balance(); @@ -678,6 +680,7 @@ public boolean balance() { // If balance not true, don't run balancer. if (!this.balanceSwitch) return false; + long cutoffTime = System.currentTimeMillis() + balancerPeriod; synchronized (this.balancer) { // Only allow one balance run at at time. if (this.assignmentManager.isRegionsInTransition()) { @@ -717,10 +720,20 @@ } } List plans = this.balancer.balanceCluster(assignments); + int rpCount = 0; // number of RegionPlans balanced so far + long totalRegPlanExecTime = 0; if (plans != null && !plans.isEmpty()) { for (RegionPlan plan: plans) { LOG.info("balance " + plan); + long balStartTime = System.currentTimeMillis(); this.assignmentManager.balance(plan); + totalRegPlanExecTime += System.currentTimeMillis()-balStartTime; + rpCount++; + if (rpCount < plans.size() && + // if performing next balance exceeds cutoff time, exit the loop + System.currentTimeMillis()+(totalRegPlanExecTime/rpCount) > cutoffTime) { + break; + } } } if (this.cpHost != null) {