Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java (revision 1575412) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java (working copy) @@ -23,6 +23,7 @@ import java.util.Comparator; import java.util.Deque; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -923,14 +924,15 @@ assignments.put(server, serverRegions); regionIdx++; } - List lastFewRegions = new ArrayList(); + Set lastFewRegions = new HashSet(); // assign the remaining by going through the list and try to assign to servers one-by-one serverIdx = RANDOM.nextInt(numServers); for (HRegionInfo region : unassignedRegions) { for (int j = 0; j < numServers; j++) { // try all servers one by one ServerName serverName = servers.get((j + serverIdx) % numServers); if (!cluster.wouldLowerAvailability(region, serverName)) { - assignments.get(serverName).add(region); + List lst = assignments.get(serverName); + lst.add(region); cluster.doAssignRegion(region, serverName); serverIdx = (j + serverIdx + 1) % numServers; //remain from next server break; @@ -943,7 +945,10 @@ // make it optimal later. we can end up with this if numReplicas > numServers. for (HRegionInfo region : lastFewRegions) { int i = RANDOM.nextInt(numServers); - assignments.get(servers.get(i)).add(region); + List lst = assignments.get(servers.get(i)); + if (!lst.contains(region)) { + lst.add(region); + } } return assignments; }