Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1044483) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -1610,9 +1610,9 @@ /** * Process shutdown server removing any assignments. * @param hsi Server that went down. - * @return set of regions on this server that are not in transition + * @return list of regions in transition on this server */ - public List processServerShutdown(final HServerInfo hsi) { + public List processServerShutdown(final HServerInfo hsi) { // Clean out any existing assignment plans for this server synchronized (this.regionPlans) { for (Iterator > i = @@ -1628,7 +1628,7 @@ // Remove this server from map of servers to regions, and remove all regions // of this server from online map of regions. Set deadRegions = null; - List rits = new ArrayList(); + List rits = new ArrayList(); synchronized (this.regions) { List assignedRegions = this.servers.remove(hsi); if (assignedRegions == null || assignedRegions.isEmpty()) { @@ -1646,7 +1646,7 @@ synchronized (regionsInTransition) { for (RegionState region : this.regionsInTransition.values()) { if (deadRegions.remove(region.getRegion())) { - rits.add(region.getRegion()); + rits.add(region); } } } Index: src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java (revision 1044483) +++ src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java (working copy) @@ -40,6 +40,7 @@ import org.apache.hadoop.hbase.master.DeadServer; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.ServerManager; +import org.apache.hadoop.hbase.master.AssignmentManager.RegionState; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.Writables; import org.apache.zookeeper.KeeperException; @@ -98,7 +99,7 @@ // doing after log splitting. Could do some states before -- OPENING? // OFFLINE? -- and then others after like CLOSING that depend on log // splitting. - List regionsInTransition = + List regionsInTransition = this.services.getAssignmentManager().processServerShutdown(this.hsi); // Assign root and meta if we were carrying them. @@ -133,11 +134,16 @@ } } - // Remove regions that were in transition - for (HRegionInfo rit : regionsInTransition) hris.remove(rit); - LOG.info("Reassigning the " + hris.size() + " region(s) that " + serverName + // Skip regions that were in transition unless CLOSING or PENDING_CLOSE + for (RegionState rit : regionsInTransition) { + if (!rit.isClosing() && !rit.isPendingClose()) { + hris.remove(rit.getRegion()); + } + } + + LOG.info("Reassigning " + hris.size() + " region(s) that " + serverName + " was carrying (skipping " + regionsInTransition.size() + - " regions(s) that are in transition)"); + " regions(s) that are already in transition)"); // Iterate regions that were on this server and assign them for (Map.Entry e: hris.entrySet()) {