Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java (revision 1403602) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java (working copy) @@ -269,13 +269,22 @@ fetchFromTail = false; Map underloadedServers = new HashMap(); + float average = (float)numRegions / numServers; // for logging + int maxToTake = numRegions - (int)average; for (Map.Entry> server: serversByLoad.entrySet()) { + if (maxToTake == 0) break; // no more to take int regionCount = server.getKey().getLoad(); - if (regionCount >= min) { - break; + if (regionCount >= min && regionCount > 0) { + continue; // look for other servers which haven't reached min } - underloadedServers.put(server.getKey().getServerName(), min - regionCount); + int regionsToPut = min - regionCount; + if (regionsToPut == 0) + { + regionsToPut = 1; + maxToTake--; + } + underloadedServers.put(server.getKey().getServerName(), regionsToPut); } // number of servers that get new regions int serversUnderloaded = underloadedServers.size();