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 12a1513..d1d082e 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
@@ -662,7 +662,7 @@ public class AssignmentManager extends ZooKeeperListener {
/**
* Add to the in-memory copy of regions in transition and then call close
- * handler on passed region hri
+ * handler on passed region hri.
* @param hri
* @param state
* @param oldData
@@ -875,10 +875,10 @@ public class AssignmentManager extends ZooKeeperListener {
break;
}
if (regionState == null ||
- (!regionState.isPendingOpen() && !regionState.isOpening())) {
+ (!regionState.isOffline() && !regionState.isPendingOpen() && !regionState.isOpening())) {
LOG.warn("Received FAILED_OPEN for region " + prettyPrintedRegionName +
" from server " + sn + " but region was in " +
- " the state " + regionState + " and not in PENDING_OPEN or OPENING");
+ " the state " + regionState + " and not in OFFLINE, PENDING_OPEN or OPENING");
return;
}
// Handle this the same as if it were opened and then closed.
@@ -901,18 +901,17 @@ public class AssignmentManager extends ZooKeeperListener {
failoverProcessedRegions.put(encodedName, hri);
break;
}
- // Should see OPENING after we have asked it to OPEN or additional
- // times after already being in state of OPENING
+ // Reget state. Can be OFFLINE (not yet moved to PENDING_OPEN), PENDING_OPEN, or the
+ // regionserver may be updating its OPENING state so could be OPENING too.
if (regionState == null ||
- (!regionState.isPendingOpen() && !regionState.isOpening())) {
- LOG.warn("Received OPENING for region " +
- prettyPrintedRegionName +
- " from server " + sn + " but region was in " +
- " the state " + regionState + " and not " +
- "in expected PENDING_OPEN or OPENING states");
+ (!regionState.isOffline() && !regionState.isPendingOpen() &&
+ !regionState.isOpening())) {
+ LOG.warn("Received OPENING for region " + prettyPrintedRegionName + " from server " +
+ sn + " but region was in " + " the state " + regionState + " and not " +
+ "in expected OFFLINE, PENDING_OPEN or OPENING states");
return;
}
- // Transition to OPENING (or update stamp if already OPENING)
+ // Transition to OPENING (or update stamp if already OPENING).
regionState.update(RegionState.State.OPENING, createTime, sn);
break;
@@ -1447,14 +1446,17 @@ public class AssignmentManager extends ZooKeeperListener {
try {
LOG.debug("Assigning region " + state.getRegion().getRegionNameAsString() +
" to " + plan.getDestination().toString());
- // Transition RegionState to PENDING_OPEN
- state.update(RegionState.State.PENDING_OPEN, System.currentTimeMillis(),
- plan.getDestination());
// Send OPEN RPC. This can fail if the server on other end is is not up.
// Pass the version that was obtained while setting the node to OFFLINE.
- RegionOpeningState regionOpenState = serverManager.sendRegionOpen(plan
- .getDestination(), state.getRegion(), versionOfOfflineNode);
- if (regionOpenState == RegionOpeningState.ALREADY_OPENED) {
+ RegionOpeningState regionOpenState = this.serverManager.sendRegionOpen(plan.getDestination(),
+ state.getRegion(), versionOfOfflineNode);
+ if (regionOpenState == RegionOpeningState.OPENED) {
+ // Transition RegionState to PENDING_OPEN while we wait on the regionserver to take
+ // control of the region (we'll know it owns region when the zk callback has changed the
+ // znode to OPENING and the RegionState gets updated to OPENING).
+ state.update(RegionState.State.PENDING_OPEN, System.currentTimeMillis(),
+ plan.getDestination());
+ } else if (regionOpenState == RegionOpeningState.ALREADY_OPENED) {
alreadyOpen(state, plan);
}
break;
@@ -1695,7 +1697,7 @@ public class AssignmentManager extends ZooKeeperListener {
@Override
public void processResult(int rc, String path, Object ctx, Stat stat) {
if (rc != 0) {
- // Thisis resultcode. If non-zero, need to resubmit.
+ // This is resultcode. If non-zero, need to resubmit.
LOG.warn("rc != 0 for " + path + " -- retryable connectionloss -- " +
"FIX see http://wiki.apache.org/hadoop/ZooKeeper/FAQ#A2");
return;
@@ -3366,8 +3368,16 @@ public class AssignmentManager extends ZooKeeperListener {
public enum State {
OFFLINE, // region is in an offline state
- PENDING_OPEN, // sent rpc to server to open but has not begun
- OPENING, // server has begun to open but not yet done
+
+ // We have sent the open rpc to the region server. We hold this state until regionserver
+ // assumes control of the region by setting znode to OPENING from OFFLINE (This is an
+ // in-memory state only with no corresponding znode state
+ PENDING_OPEN,
+
+ // Set by zk callback when regionserver moves znode from OFFLINE to OPENING. Regionserver now
+ // has control of the region.
+ OPENING,
+
OPEN, // server opened region and updated meta
PENDING_CLOSE, // sent rpc to server to close but has not begun
CLOSING, // server has begun to close but not yet done