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; }
"Received report {} transition from {} for {}, pid={}" + ", but the region is not in CLOSING state, should be a retry, ignore", TransitionCode.CLOSED, serverName, regionNode, getProcId()); return; "Received report {} transition from {} for {}, pid={} but the proc is not in {}" + " state, should be a retry, ignore", TransitionCode.CLOSED, serverName, regionNode, getProcId(), REGION_STATE_TRANSITION_CONFIRM_CLOSED); return; "Received report {} transition from {} for {}, pid={}," + " but the region is not on it, should be a retry, ignore", TransitionCode.CLOSED, serverName, regionNode, getProcId()); return;
private void reportTransitionFailedOpen(MasterProcedureEnv env, RegionStateNode regionNode, ServerName serverName) { if (!isOpening(regionNode, serverName, TransitionCode.FAILED_OPEN)) { return; } // there is no openSeqNum for FAILED_OPEN, so we will check the target server instead if (!regionNode.getRegionLocation().equals(serverName)) { LOG.warn( "Received report {} transition from {} for {}, pid={}," + " but the region is not on it, should be a retry, ignore", TransitionCode.FAILED_OPEN, regionNode, serverName, getProcId()); return; } // just wake up the procedure and see if we can retry // Notice that, even if we arrive here, this call could still be a retry, as we may retry // opening on the same server again. And the assumption here is that, once the region state is // OPENING, and the TRSP state is REGION_STATE_TRANSITION_CONFIRM_OPENED, the TRSP must have // been suspended on the procedure event, so after the waking operation here, the TRSP will be // executed and try to schedule new OpenRegionProcedure again. Once there is a successful open // then we are done, so the TRSP will not be stuck. // TODO: maybe we could send the procedure id of the OpenRegionProcedure to the region server // and let the region server send it back when done, so it will be easy to detect whether this // is a retry. regionNode.getProcedureEvent().wake(env.getProcedureScheduler()); }
"Received report {} transition from {} for {}, pid={} but the new openSeqNum {}" + " is less than the current one {}, should be a retry, ignore", TransitionCode.OPENED, serverName, regionNode, getProcId(), openSeqNum, regionNode.getOpenSeqNum()); return; " should be a retry, ignore", TransitionCode.OPENED, serverName, regionNode, getProcId()); return;
public long assign(RegionInfo regionInfo, ServerName sn) throws IOException { // TODO: should we use getRegionStateNode? RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo); TransitRegionStateProcedure proc; regionNode.lock(); try { preTransitCheck(regionNode, STATES_EXPECTED_ON_ASSIGN); proc = TransitRegionStateProcedure.assign(getProcedureEnvironment(), regionInfo, sn); regionNode.setProcedure(proc); } finally { regionNode.unlock(); } ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc); return proc.getProcId(); }
out.print( regionStateNode.getState() ); out.write("</td>\n <td>"); out.print( regionStateNode.getProcedure().getProcId() ); out.write("</td>\n <td>"); out.print( escapeXml(regionStateNode.getProcedure().getState().toString() + (regionStateNode.getProcedure().isBypass() ? "(Bypassed)" : "")) ); for (RegionStateNode regionStateNode : rit) { out.write("\n "); out.print( regionStateNode.getProcedure().getProcId() ); out.write("<br>\n ");
public long unassign(RegionInfo regionInfo) throws IOException { RegionStateNode regionNode = regionStates.getRegionStateNode(regionInfo); if (regionNode == null) { throw new UnknownRegionException("No RegionState found for " + regionInfo.getEncodedName()); } TransitRegionStateProcedure proc; regionNode.lock(); try { preTransitCheck(regionNode, STATES_EXPECTED_ON_UNASSIGN_OR_MOVE); proc = TransitRegionStateProcedure.unassign(getProcedureEnvironment(), regionInfo); regionNode.setProcedure(proc); } finally { regionNode.unlock(); } ProcedureSyncWait.submitAndWaitProcedure(master.getMasterProcedureExecutor(), proc); return proc.getProcId(); }
IdLock procExecLock = procExec.getProcExecutionLock(); IdLock.Entry lockEntry = procExecLock.getLockEntry(proc.getProcId() + 2);
public void updateRegionLocation(RegionStateNode regionStateNode) throws IOException { if (regionStateNode.getRegionInfo().isMetaRegion()) { updateMetaLocation(regionStateNode.getRegionInfo(), regionStateNode.getRegionLocation(), regionStateNode.getState()); } else { long openSeqNum = regionStateNode.getState() == State.OPEN ? regionStateNode.getOpenSeqNum() : HConstants.NO_SEQNUM; updateUserRegionLocation(regionStateNode.getRegionInfo(), regionStateNode.getState(), regionStateNode.getRegionLocation(), openSeqNum, // The regionStateNode may have no procedure in a test scenario; allow for this. regionStateNode.getProcedure() != null ? regionStateNode.getProcedure().getProcId() : Procedure.NO_PROC_ID); } }