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 2035f6a..a8e2c0e 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 @@ -1127,7 +1127,8 @@ 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))) { // Close it without updating the internal region states, // so as not to create double assignments in unlucky scenarios // mentioned in OpenRegionHandler#process @@ -1136,8 +1137,13 @@ public class AssignmentManager extends ZooKeeperListener { return; } // Handle OPENED by removing from transition and deleted zk node - regionState = - regionStates.transitionOpenFromPendingOpenOrOpeningOnServer(rt,regionState, sn); + // We deal with two situations here: either the region is pending open/opening in + // the target RS; or the region has already opened in the target RS, we just need + // to clean up the RIT state.See HBASE-17275 + if (regionState.isPendingOpenOrOpeningOnServer(sn)) { + regionState = + regionStates.transitionOpenFromPendingOpenOrOpeningOnServer(rt,regionState, sn); + } if (regionState != null) { failedOpenTracker.remove(encodedName); // reset the count, if any new OpenedRegionHandler(