Author: nspiegelberg
Date: Wed Jan  4 23:46:26 2012
New Revision: 1227393

URL: http://svn.apache.org/viewvc?rev=1227393&view=rev
Log:
[master] Average load should compensate for ignored servers

Summary:
When computing the average load across region servers for load balancing
purposes, ServerManager ignores all regions hosted by servers which have
regions being held for them (preferred assignments). However, the number
of servers over which the load was being averaged was not adjusted,
causing the average load to change significantly (and incorrectly)
whenever a preferred assignment was made.

This change adjusts the number of servers when computing the average
load, to compensate for the servers which are ignored.

Test Plan:
mvn -Dtest=TestRegionRebalancing test
Use the shell's move_region command on a balanced cluster and observe
that there are no extraneous region movements.

Reviewers: kranganathan, kannan, liyintang

Reviewed By: liyintang

CC: hbase-eng@lists, kranganathan, liyintang

Differential Revision: 375176

Modified:
    
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java

Modified: 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=1227393&r1=1227392&r2=1227393&view=diff
==============================================================================
--- 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
 (original)
+++ 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
 Wed Jan  4 23:46:26 2012
@@ -813,20 +813,17 @@ public class ServerManager {
       for (Map.Entry<String, HServerLoad> entry : serversToLoad.entrySet()) {
         HServerInfo hsi = serversToServerInfo.get(entry.getKey());
         if (null != hsi) {
-          if (!this.master.getRegionManager().assignmentManager
-              .hasPreferredAssignment(hsi.getServerAddress())) {
-            totalLoad += entry.getValue().getNumberOfRegions();
-          } else {
-            // Master has held some regions for this server, ignore this server
-            // for loadbalancing purposes
-          }
+          totalLoad += entry.getValue().getNumberOfRegions();
         } else {
           // this server has already been removed from the serversToServerInfo
           // map, but not from the serversToLoad one yet, thus ignore it for
           // loadbalancing purposes
+          numServers--;
         }
       }
-      averageLoad = (double)totalLoad / (double)numServers;
+      if (numServers > 0) {
+        averageLoad = (double)totalLoad / (double)numServers;
+      }
     }
     return averageLoad;
   }


Reply via email to