Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1351555) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -447,6 +447,13 @@ // no lock concurrent access ok: some threads may be adding/removing items but its java-valid nodes.removeAll(regionsInTransition.keySet()); + // If some dead servers are processed by ServerShutdownHandler, we shouldn't + // assign all user regions( some would be assigned by + // ServerShutdownHandler), consider it as a failover + if (!this.serverManager.getDeadServers().isEmpty()) { + this.failover = true; + } + // If we found user regions out on cluster, its a failover. if (this.failover) { LOG.info("Found regions out on cluster or in RIT; failover"); @@ -2801,6 +2808,9 @@ // skip regions of dead servers because SSH will process regions during rs expiration. // see HBASE-5916 if (actualDeadServers.contains(deadServer.getKey())) { + for (Pair deadRegion : deadServer.getValue()) { + nodes.remove(deadRegion.getFirst().getEncodedName()); + } continue; } List> regions = deadServer.getValue();