@VisibleForTesting static int compare(TransitRegionStateProcedure left, TransitRegionStateProcedure right) { if (left.getRegion().isMetaRegion()) { if (right.getRegion().isMetaRegion()) { return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion()); } return -1; } else if (right.getRegion().isMetaRegion()) { return +1; } if (left.getRegion().getTable().isSystemTable()) { if (right.getRegion().getTable().isSystemTable()) { return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion()); } return -1; } else if (right.getRegion().getTable().isSystemTable()) { return +1; } return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion()); }
private void openRegion(MasterProcedureEnv env, RegionStateNode regionNode) throws IOException { ServerName loc = regionNode.getRegionLocation(); if (loc == null) { LOG.warn("No location specified for {}, jump back to state {} to get one", getRegion(), RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE); setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE); return; } env.getAssignmentManager().regionOpening(regionNode); addChildProcedure(new OpenRegionProcedure(getRegion(), loc)); setNextState(RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED); }
private RegionStateNode getRegionStateNode(MasterProcedureEnv env) { return env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion()); }
@Override protected boolean waitInitialized(MasterProcedureEnv env) { if (TableName.isMetaTableName(getTableName())) { return false; } // First we need meta to be loaded, and second, if meta is not online then we will likely to // fail when updating meta so we wait until it is assigned. AssignmentManager am = env.getAssignmentManager(); return am.waitMetaLoaded(this) || am.waitMetaAssigned(this, getRegion()); }
RegionInfo regionInfo = proc.getRegion(); RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(regionInfo); TransitRegionStateProcedure existingProc = regionNode.getProcedure();
@SuppressWarnings("rawtypes") @Override protected Procedure[] execute(MasterProcedureEnv env) throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException { RegionStateNode regionNode = env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion()); regionNode.lock(); try { return super.execute(env); } finally { regionNode.unlock(); } }
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 (!RegionReplicaUtil.isDefaultReplica(getRegion()) && lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_CLOSED) { regionNode.unsetProcedure(this);
private void testRecoveryAndDoubleExcution(TransitRegionStateProcedure proc) throws Exception { HMaster master = UTIL.getHBaseCluster().getMaster(); AssignmentManager am = master.getAssignmentManager(); RegionStateNode regionNode = am.getRegionStates().getRegionStateNode(proc.getRegion()); assertFalse(regionNode.isInTransition()); regionNode.setProcedure(proc); assertTrue(regionNode.isInTransition()); ProcedureExecutor<MasterProcedureEnv> procExec = master.getMasterProcedureExecutor(); ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, true); long procId = procExec.submitProcedure(proc); MasterProcedureTestingUtility.testRecoveryAndDoubleExecution(procExec, procId); regionNode = am.getRegionStates().getRegionStateNode(proc.getRegion()); assertFalse(regionNode.isInTransition()); }
.filter(p -> p instanceof TransitRegionStateProcedure) .map(p -> (TransitRegionStateProcedure) p) .anyMatch(p -> Bytes.equals(hri.getRegionName(), p.getRegion().getRegionName()))); proc.resume(); UTIL.waitFor(30000, () -> executor.isFinished(procId));
.filter(p -> p instanceof TransitRegionStateProcedure) .map(p -> (TransitRegionStateProcedure) p) .anyMatch(p -> Bytes.equals(hri.getRegionName(), p.getRegion().getRegionName()))); proc.resume(); UTIL.waitFor(30000, () -> executor.isFinished(procId));