diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index ebc3d01..1fea15a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -2126,6 +2126,8 @@ public class AssignmentManager extends ZooKeeperListener { State.PENDING_OPEN, plan.getDestination()); boolean needNewPlan; + /** set false when we want to force-exclude previous attempted host */ + boolean reuseDestinationHost = true; final String assignMsg = "Failed assignment of " + region.getRegionNameAsString() + " to " + plan.getDestination(); try { @@ -2170,6 +2172,10 @@ public class AssignmentManager extends ZooKeeperListener { boolean retry = !hold && (t instanceof java.net.SocketTimeoutException && this.serverManager.isServerOnline(plan.getDestination())); + if (t instanceof RegionServerStoppedException) { + // we know for sure this RS is going away, be sure not to try it again + reuseDestinationHost = false; + } if (hold) { LOG.warn(assignMsg + ", waiting a little before trying on the same region server " + @@ -2242,7 +2248,11 @@ public class AssignmentManager extends ZooKeeperListener { // excluded since it could be the only server up now. RegionPlan newPlan = null; try { - newPlan = getRegionPlan(region, true); + if (reuseDestinationHost) { + newPlan = getRegionPlan(region, true); + } else { + newPlan = getRegionPlan(region, plan.getDestination(), true); + } } catch (HBaseIOException e) { LOG.warn("Failed to get region plan", e); }