Index: src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java (revision 1094812) +++ src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java (working copy) @@ -66,11 +66,22 @@ private static final Random RANDOM = new Random(System.currentTimeMillis()); // slop for regions private float slop; + // threshold of region count below which region server is considered new + private float newRegionServerThreshold; LoadBalancer(Configuration conf) { this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2); if (slop < 0) slop = 0; else if (slop > 1) slop = 1; + + // the threshold as percentage of average region count for region server + // to be considered seriously underloaded in which case we move both + // young and old regions onto the server + this.newRegionServerThreshold = conf.getFloat("hbase.region.count.threshold", (float) 0.1); + if (this.newRegionServerThreshold < 0) this.newRegionServerThreshold = 0; + else if (this.newRegionServerThreshold > 1) { + this.newRegionServerThreshold = 1; + } } /* @@ -207,12 +218,21 @@ for(Map.Entry> server: clusterState.entrySet()) { int sz = server.getValue().size(); - if (sz == 0) emptyRegionServerPresent = true; server.getKey().getLoad().setNumberOfRegions(sz); numRegions += server.getKey().getLoad().getNumberOfRegions(); serversByLoad.put(server.getKey(), server.getValue()); } - + int numRegionsThreshold = (int)(numRegions / clusterState.size() * + this.newRegionServerThreshold); + for(Map.Entry> server: + clusterState.entrySet()) { + int sz = server.getValue().size(); + if (sz <= numRegionsThreshold) { + emptyRegionServerPresent = true; + break; + } + } + // Check if we even need to do any load balancing float average = (float)numRegions / numServers; // for logging // HBASE-3681 check sloppiness first