Index: src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java (revision 1076923) +++ src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java (working copy) @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -59,6 +60,17 @@ private static final Log LOG = LogFactory.getLog(LoadBalancer.class); private static final Random rand = new Random(); + static class RegionPlanComparator implements Comparator { + @Override + public int compare(RegionPlan l, RegionPlan r) { + long diff = r.getRegionInfo().getRegionId() - l.getRegionInfo().getRegionId(); + if (diff < 0) return -1; + if (diff > 0) return 1; + return 0; + } + } + static RegionPlanComparator rpComparator = new RegionPlanComparator(); + /** * Generate a global load balancing plan according to the specified map of * server information to the most loaded regions of each server. @@ -184,7 +196,9 @@ List regions = server.getValue(); int numToOffload = Math.min(regionCount - max, regions.size()); int numTaken = 0; - for (HRegionInfo hri: regions) { + int sz = regions.size(); + for (int i = sz-1; i >= 0; i--) { + HRegionInfo hri = regions.get(i); // Don't rebalance meta regions. if (hri.isMetaRegion()) continue; regionsToMove.add(new RegionPlan(hri, serverInfo, null)); @@ -194,6 +208,8 @@ serverBalanceInfo.put(serverInfo, new BalanceInfo(numToOffload, (-1)*numTaken)); } + // put young regions at the beginning of regionsToMove + Collections.sort(regionsToMove, rpComparator); // Walk down least loaded, filling each to the min int serversUnderloaded = 0; // number of servers that get new regions