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;
}