Index: apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- apache/hadoop/hbase/master/AssignmentManager.java (版本 1142899) +++ apache/hadoop/hbase/master/AssignmentManager.java (工作副本) @@ -35,6 +35,7 @@ import java.util.TreeMap; import java.util.TreeSet; import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.logging.Log; @@ -122,8 +123,8 @@ * with the other under a lock on {@link #regions} * @see #regions */ - private final NavigableMap> servers = - new TreeMap>(); + private final NavigableMap> servers = + new TreeMap>(); /** * Region to server assignment map. @@ -779,7 +780,7 @@ synchronized (this.regions) { HServerInfo serverInfo = this.regions.remove(regionInfo); if (serverInfo == null) return; - List serverRegions = this.servers.get(serverInfo); + Set serverRegions = this.servers.get(serverInfo); if (!serverRegions.remove(regionInfo)) { LOG.warn("No " + regionInfo + " on " + serverInfo); } @@ -1590,12 +1591,12 @@ * @param hri */ private void addToServers(final HServerInfo hsi, final HRegionInfo hri) { - List hris = servers.get(hsi); + Set hris = servers.get(hsi); if (hris == null) { - hris = new ArrayList(); + hris = new ConcurrentSkipListSet(); servers.put(hsi, hris); } - hris.add(hri); + if (!hris.contains(hri)) hris.add(hri); } /** @@ -1639,13 +1640,8 @@ } synchronized (this.regions) { this.regions.remove(hri); - for (List regions : this.servers.values()) { - for (int i=0;i regions : this.servers.values()) { + regions.remove(hri); } } clearRegionPlan(hri); @@ -1900,7 +1896,7 @@ Set deadRegions = null; List rits = new ArrayList(); synchronized (this.regions) { - List assignedRegions = this.servers.remove(hsi); + Set assignedRegions = this.servers.remove(hsi); if (assignedRegions == null || assignedRegions.isEmpty()) { // No regions on this server, we are done, return empty list of RITs return rits; @@ -1987,7 +1983,7 @@ Map> result = null; synchronized (this.regions) { result = new HashMap>(this.servers.size()); - for (Map.Entry> e: this.servers.entrySet()) { + for (Map.Entry> e: this.servers.entrySet()) { List shallowCopy = new ArrayList(e.getValue()); HServerInfo clone = new HServerInfo(e.getKey()); // Set into server load the number of regions this server is carrying