Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1142537) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -24,7 +24,6 @@ import java.io.IOException; import java.lang.Thread.UncaughtExceptionHandler; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -36,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 java.util.concurrent.atomic.AtomicLong; @@ -53,9 +53,9 @@ import org.apache.hadoop.hbase.catalog.MetaReader; import org.apache.hadoop.hbase.catalog.RootLocationEditor; import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.executor.EventHandler.EventType; import org.apache.hadoop.hbase.executor.ExecutorService; import org.apache.hadoop.hbase.executor.RegionTransitionData; +import org.apache.hadoop.hbase.executor.EventHandler.EventType; import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; import org.apache.hadoop.hbase.master.LoadBalancer.RegionPlan; import org.apache.hadoop.hbase.master.handler.ClosedRegionHandler; @@ -125,8 +125,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. @@ -182,7 +182,7 @@ // Sync on this.regions because access to this.servers always synchronizes // in this order. synchronized (this.regions) { - for (Map.Entry> e: servers.entrySet()) { + for (Map.Entry> e: servers.entrySet()) { numServers++; totalLoad += e.getValue().size(); } @@ -710,7 +710,7 @@ private HRegionInfo findHRegionInfo(final ServerName sn, final String encodedName) { if (!this.serverManager.isServerOnline(sn)) return null; - List hris = this.servers.get(sn); + Set hris = this.servers.get(sn); HRegionInfo foundHri = null; for (HRegionInfo hri: hris) { if (hri.getEncodedName().equals(encodedName)) { @@ -954,7 +954,7 @@ synchronized (this.regions) { ServerName sn = this.regions.remove(regionInfo); if (sn == null) return; - List serverRegions = this.servers.get(sn); + Set serverRegions = this.servers.get(sn); if (!serverRegions.remove(regionInfo)) { LOG.warn("No " + regionInfo + " on " + sn); } @@ -1818,12 +1818,12 @@ * @param hri */ private void addToServers(final ServerName sn, final HRegionInfo hri) { - List hris = servers.get(sn); + Set hris = servers.get(sn); if (hris == null) { - hris = new ArrayList(); + hris = new ConcurrentSkipListSet(); servers.put(sn, hris); } - hris.add(hri); + if (!hris.contains(hri)) hris.add(hri); } /** @@ -1865,13 +1865,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); @@ -2124,7 +2119,7 @@ Set deadRegions = null; List rits = new ArrayList(); synchronized (this.regions) { - List assignedRegions = this.servers.remove(sn); + Set assignedRegions = this.servers.remove(sn); if (assignedRegions == null || assignedRegions.isEmpty()) { // No regions on this server, we are done, return empty list of RITs return rits; @@ -2184,7 +2179,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()) { result.put(e.getKey(), new ArrayList(e.getValue())); } } @@ -2224,8 +2219,8 @@ void unassignCatalogRegions() { this.servers.entrySet(); synchronized (this.regions) { - for (Map.Entry> e: this.servers.entrySet()) { - List regions = e.getValue(); + for (Map.Entry> e: this.servers.entrySet()) { + Set regions = e.getValue(); if (regions == null || regions.isEmpty()) continue; for (HRegionInfo hri: regions) { if (hri.isMetaRegion()) { @@ -2237,30 +2232,6 @@ } /** - * Assigns list of user regions in round-robin fashion, if any. - * @param sync True if we are to wait on all assigns. - * @param startup True if this is server startup time. - * @throws InterruptedException - * @throws IOException - */ - void bulkAssignUserRegions(final HRegionInfo [] regions, - final List servers, final boolean sync) - throws IOException { - Map> bulkPlan = - LoadBalancer.roundRobinAssignment(Arrays.asList(regions), servers); - LOG.info("Bulk assigning " + regions.length + " region(s) " + - "round-robin across " + servers.size() + " server(s)"); - // Use fixed count thread pool assigning. - BulkAssigner ba = new GeneralBulkAssigner(this.master, bulkPlan, this); - try { - ba.bulkAssign(sync); - } catch (InterruptedException e) { - throw new IOException("InterruptedException bulk assigning", e); - } - LOG.info("Bulk assigning done"); - } - - /** * State of a Region while undergoing transitions. */ public static class RegionState implements Writable {