Author: tedyu
Date: Tue Oct 30 20:08:22 2012
New Revision: 1403851

URL: http://svn.apache.org/viewvc?rev=1403851&view=rev
Log:
HBASE-7060 Region load balancing by table does not handle the case where a 
table's region count is lower than the number of the RS in the cluster (Ted Yu 
and Tianying)


Modified:
    
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java

Modified: 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java?rev=1403851&r1=1403850&r2=1403851&view=diff
==============================================================================
--- 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java
 (original)
+++ 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java
 Tue Oct 30 20:08:22 2012
@@ -269,13 +269,22 @@ public class DefaultLoadBalancer extends
     fetchFromTail = false;
 
     Map<ServerName, Integer> underloadedServers = new HashMap<ServerName, 
Integer>();
+    float average = (float)numRegions / numServers; // for logging
+    int maxToTake = numRegions - (int)average;
     for (Map.Entry<ServerAndLoad, List<HRegionInfo>> 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();


Reply via email to