diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java index d7ba4ec..72278a7 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java @@ -927,17 +927,20 @@ public abstract class BaseLoadBalancer implements LoadBalancer { // assign the remaining by going through the list and try to assign to servers one-by-one serverIdx = RANDOM.nextInt(numServers); for (HRegionInfo region : unassignedRegions) { + boolean assigned = false; for (int j = 0; j < numServers; j++) { // try all servers one by one ServerName serverName = servers.get((j + serverIdx) % numServers); if (!cluster.wouldLowerAvailability(region, serverName)) { assignments.get(serverName).add(region); cluster.doAssignRegion(region, serverName); serverIdx = (j + serverIdx + 1) % numServers; //remain from next server + assigned = true; break; - } else { - lastFewRegions.add(region); } } + if (!assigned) { + lastFewRegions.add(region); + } } // just sprinkle the rest of the regions on random regionservers. The balanceCluster will // make it optimal later. we can end up with this if numReplicas > numServers.