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..8e36b93 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 @@ -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,15 +901,12 @@ 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 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) @@ -1447,14 +1444,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 +1695,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 +3366,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