@Override protected boolean shouldDispatch(RegionStateNode regionNode) { return regionNode.isInState(RegionState.State.CLOSING); } }
@Override protected boolean shouldDispatch(RegionStateNode regionNode) { return regionNode.isInState(RegionState.State.OPENING); } }
/** * @param update new region state this node should be assigned. * @param expected current state should be in this given list of expected states * @return true, if current state is in expected list; otherwise false. */ public boolean setState(final State update, final State... expected) { if (!isInState(expected)) { return false; } this.state = update; this.lastUpdate = EnvironmentEdgeManager.currentTime(); return true; }
public boolean isStuck() { return isInState(State.FAILED_OPEN) && getProcedure() != null; }
private boolean isOpening(RegionStateNode regionNode, ServerName serverName, TransitionCode code) { if (!regionNode.isInState(State.OPENING)) { LOG.warn("Received report {} transition from {} for {}, pid={}, but the region is not in" + " OPENING state, should be a retry, ignore", code, serverName, regionNode, getProcId()); return false; } if (getCurrentState() != REGION_STATE_TRANSITION_CONFIRM_OPENED) { LOG.warn( "Received report {} transition from {} for {}, pid={}," + " but the TRSP is not in {} state, should be a retry, ignore", code, serverName, regionNode, getProcId(), REGION_STATE_TRANSITION_CONFIRM_OPENED); return false; } return true; }
/** * Utility. Whether to include region in list of regions. Default is to * weed out split and offline regions. * @return True if we should include the <code>node</code> (do not include * if split or offline unless <code>offline</code> is set to true. */ boolean include(final RegionStateNode node, final boolean offline) { if (LOG.isTraceEnabled()) { LOG.trace("WORKING ON " + node + " " + node.getRegionInfo()); } if (node.isInState(State.SPLIT)) return false; if (node.isInState(State.OFFLINE) && !offline) return false; final RegionInfo hri = node.getRegionInfo(); return (!hri.isOffline() && !hri.isSplit()) || ((hri.isOffline() || hri.isSplit()) && offline); }
public boolean isRegionInState(RegionInfo regionInfo, State... state) { RegionStateNode regionNode = getRegionStateNode(regionInfo); if (regionNode != null) { regionNode.lock(); try { return regionNode.isInState(state); } finally { regionNode.unlock(); } } return false; }
if (regionNode.isInState(State.CLOSED)) { attempt = 0; if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) { return Flow.HAS_MORE_STATE; if (regionNode.isInState(State.CLOSING)) { assert regionNode.isInState(State.ABNORMALLY_CLOSED); if (!RegionReplicaUtil.isDefaultReplica(getRegion()) && lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) {
private HRegionLocation createRegionForReopen(RegionStateNode node) { node.lock(); try { if (!include(node, false)) { return null; } if (node.isInState(State.OPEN)) { return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), node.getOpenSeqNum()); } else if (node.isInState(State.OPENING)) { return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1); } else { return null; } } finally { node.unlock(); } }
private void reportTransitionClosed(MasterProcedureEnv env, RegionStateNode regionNode, ServerName serverName) throws IOException { if (!regionNode.isInState(State.CLOSING)) { LOG.warn( "Received report {} transition from {} for {}, pid={}" +
private void preTransitCheck(RegionStateNode regionNode, RegionState.State[] expectedStates) throws HBaseIOException { if (regionNode.getProcedure() != null) { throw new HBaseIOException(regionNode + " is currently in transition"); } if (!regionNode.isInState(expectedStates)) { throw new DoNotRetryRegionException("Unexpected state for " + regionNode); } if (getTableStateManager().isTableState(regionNode.getTable(), TableState.State.DISABLING, TableState.State.DISABLED)) { throw new DoNotRetryIOException(regionNode.getTable() + " is disabled for " + regionNode); } }
private void closeRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException { if (regionNode.isInState(State.OPEN, State.CLOSING, State.MERGING, State.SPLITTING)) { // this is the normal case env.getAssignmentManager().regionClosing(regionNode); addChildProcedure( new CloseRegionProcedure(getRegion(), regionNode.getRegionLocation(), assignCandidate)); setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED); } else { forceNewPlan = true; regionNode.setRegionLocation(null); setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE); } }
if (oldLoc.getSeqNum() >= 0) { if (node.isInState(State.OPEN)) { if (node.getOpenSeqNum() > oldLoc.getSeqNum()) { if (!node.isInState(State.OPEN, State.OPENING)) { long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1; return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);
if (regionNode.isInState(State.OPEN)) { attempt = 0; if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {
public static boolean waitForAssignment(AssignmentManager am, RegionInfo regionInfo) throws IOException { // This method can be called before the regionInfo has made it into the regionStateMap // so wait around here a while. Waiter.waitFor(am.getConfiguration(), 10000, () -> am.getRegionStates().getRegionStateNode(regionInfo) != null); RegionStateNode regionNode = am.getRegionStates().getRegionStateNode(regionInfo); // Wait until the region has already been open, or we have a TRSP along with it. Waiter.waitFor(am.getConfiguration(), 30000, () -> regionNode.isInState(State.OPEN) || regionNode.isInTransition()); TransitRegionStateProcedure proc = regionNode.getProcedure(); regionNode.lock(); try { if (regionNode.isInState(State.OPEN)) { return true; } proc = regionNode.getProcedure(); } finally { regionNode.unlock(); } assertNotNull(proc); ProcedureSyncWait.waitForProcedureToCompleteIOE(am.getMaster().getMasterProcedureExecutor(), proc, 5L * 60 * 1000); return true; } }