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 502b63f..5d2c62c 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 @@ -1128,7 +1128,14 @@ public class AssignmentManager extends ZooKeeperListener { + " from " + sn + " but the region isn't PENDING_OPEN/OPENING here: " + regionStates.getRegionState(encodedName)); - if (regionState != null) { + if(regionState != null && regionState.isOpened() && regionState.getServerName().equals(sn)) { + //if this region was opened before on this rs, we don't have to unassign it. It won't cause + //double assign. One possible scenario of what happened is HBASE-17275 + failedOpenTracker.remove(encodedName); // reset the count, if any + new OpenedRegionHandler( + server, this, regionState.getRegion(), coordination, ord).process(); + updateOpenedRegionHandlerTracker(regionState.getRegion()); + } else if (regionState != null) { // Close it without updating the internal region states, // so as not to create double assignments in unlucky scenarios // mentioned in OpenRegionHandler#process