public abstract class RegionTransitionProcedure extends <any> implements TableProcedureInterface
This procedure is asynchronous and responds to external events. The AssignmentManager will notify this procedure when the RS completes the operation and reports the transitioned state (see the Assign and Unassign class for more detail).
Procedures move from the REGION_TRANSITION_QUEUE state when they are first submitted, to the REGION_TRANSITION_DISPATCH state when the request to remote server is sent and the Procedure is suspended waiting on external event to be woken again. Once the external event is triggered, Procedure moves to the REGION_TRANSITION_FINISH state.
NOTE: AssignProcedure
and UnassignProcedure
should not be thought of
as being asymmetric, at least currently.
AssignProcedure
moves through all the above described states and implements methods
associated with each while UnassignProcedure
starts at state
REGION_TRANSITION_DISPATCH and state REGION_TRANSITION_QUEUE is not supported.AssignProcedure
fails, failure handler
AssignProcedure#handleFailure(MasterProcedureEnv, RegionStateNode) re-attempts the
assignment by setting the procedure state to REGION_TRANSITION_QUEUE and forces
assignment to a different target server by setting AssignProcedure.forceNewPlan
. When
the number of attempts reaches threshold configuration 'hbase.assignment.maximum.attempts',
the procedure is aborted. For UnassignProcedure
, similar re-attempts are
intentionally not implemented. It is a 'one shot' procedure. See its class doc for how it
handles failure.
regionInfo
.
TODO: Considering it is a priority doing all we can to get make a region available as soon as
possible, re-attempting with any target makes sense if specified target fails in case of
AssignProcedure
. For UnassignProcedure
, our concern is preventing data loss
on failed unassign. See class doc for explanation.
TableProcedureInterface.TableOperationType
Modifier and Type | Field and Description |
---|---|
protected java.util.concurrent.atomic.AtomicBoolean |
aborted |
Constructor and Description |
---|
RegionTransitionProcedure() |
RegionTransitionProcedure(RegionInfo regionInfo) |
Modifier and Type | Method and Description |
---|---|
protected boolean |
abort(MasterProcedureEnv env) |
protected LockState |
acquireLock(MasterProcedureEnv env) |
protected boolean |
addToRemoteDispatcher(MasterProcedureEnv env,
ServerName targetServer)
Be careful! At the end of this method, the procedure has either succeeded
and this procedure has been set into a suspended state OR, we failed and
this procedure has been put back on the scheduler ready for another worker
to pick it up.
|
protected Procedure[] |
execute(MasterProcedureEnv env) |
protected abstract void |
finishTransition(MasterProcedureEnv env,
RegionStates.RegionStateNode regionNode) |
protected int |
getAttempt() |
RegionInfo |
getRegionInfo() |
RegionStates.RegionStateNode |
getRegionState(MasterProcedureEnv env) |
abstract ServerName |
getServer(MasterProcedureEnv env)
Used by ServerCrashProcedure to see if this Assign/Unassign needs processing.
|
TableName |
getTableName() |
protected boolean |
hasLock(MasterProcedureEnv env) |
protected boolean |
holdLock(MasterProcedureEnv env) |
boolean |
isMeta() |
protected abstract boolean |
isRollbackSupported(RegionTransitionState state) |
protected boolean |
isServerOnline(MasterProcedureEnv env,
RegionStates.RegionStateNode regionNode) |
protected boolean |
isServerOnline(MasterProcedureEnv env,
ServerName serverName) |
protected void |
releaseLock(MasterProcedureEnv env) |
abstract RemoteOperation |
remoteCallBuild(MasterProcedureEnv env,
ServerName serverName) |
void |
remoteCallCompleted(MasterProcedureEnv env,
ServerName serverName,
RemoteOperation response) |
protected abstract boolean |
remoteCallFailed(MasterProcedureEnv env,
RegionStates.RegionStateNode regionNode,
java.io.IOException exception) |
void |
remoteCallFailed(MasterProcedureEnv env,
ServerName serverName,
java.io.IOException exception) |
protected abstract void |
reportTransition(MasterProcedureEnv env,
RegionStates.RegionStateNode regionNode,
TransitionCode code,
long seqId) |
protected void |
reportTransition(MasterProcedureEnv env,
ServerName serverName,
TransitionCode code,
long seqId) |
protected void |
rollback(MasterProcedureEnv env) |
protected void |
setAttempt(int attempt)
This setter is for subclasses to call in their
#deserializeStateData(ProcedureStateSerializer) method. |
protected void |
setRegionInfo(RegionInfo regionInfo)
This setter is for subclasses to call in their
#deserializeStateData(ProcedureStateSerializer) method. |
protected boolean |
setTimeoutFailure(MasterProcedureEnv env)
At end of timeout, wake ourselves up so we run again.
|
protected boolean |
shouldWaitClientAck(MasterProcedureEnv env) |
protected abstract boolean |
startTransition(MasterProcedureEnv env,
RegionStates.RegionStateNode regionNode) |
void |
toStringClassDetails(java.lang.StringBuilder sb) |
protected void |
toStringState(java.lang.StringBuilder builder) |
protected abstract boolean |
updateTransition(MasterProcedureEnv env,
RegionStates.RegionStateNode regionNode)
Called when the Procedure is in the REGION_TRANSITION_DISPATCH state.
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getTableOperationType
public RegionTransitionProcedure()
public RegionTransitionProcedure(RegionInfo regionInfo)
public RegionInfo getRegionInfo()
protected void setRegionInfo(RegionInfo regionInfo)
#deserializeStateData(ProcedureStateSerializer)
method. Expectation is that
subclasses will persist `regioninfo` in their
#serializeStateData(ProcedureStateSerializer)
method and then restore `regionInfo` on
deserialization by calling.protected void setAttempt(int attempt)
#deserializeStateData(ProcedureStateSerializer)
method.setRegionInfo(RegionInfo)
protected int getAttempt()
public TableName getTableName()
getTableName
in interface TableProcedureInterface
public boolean isMeta()
public void toStringClassDetails(java.lang.StringBuilder sb)
public RegionStates.RegionStateNode getRegionState(MasterProcedureEnv env)
protected abstract boolean startTransition(MasterProcedureEnv env, RegionStates.RegionStateNode regionNode) throws java.io.IOException, ProcedureSuspendedException
java.io.IOException
ProcedureSuspendedException
protected abstract boolean updateTransition(MasterProcedureEnv env, RegionStates.RegionStateNode regionNode) throws java.io.IOException, ProcedureSuspendedException
java.io.IOException
ProcedureSuspendedException
protected abstract void finishTransition(MasterProcedureEnv env, RegionStates.RegionStateNode regionNode) throws java.io.IOException, ProcedureSuspendedException
java.io.IOException
ProcedureSuspendedException
protected abstract void reportTransition(MasterProcedureEnv env, RegionStates.RegionStateNode regionNode, TransitionCode code, long seqId) throws UnexpectedStateException
UnexpectedStateException
public abstract RemoteOperation remoteCallBuild(MasterProcedureEnv env, ServerName serverName)
protected abstract boolean remoteCallFailed(MasterProcedureEnv env, RegionStates.RegionStateNode regionNode, java.io.IOException exception)
public void remoteCallCompleted(MasterProcedureEnv env, ServerName serverName, RemoteOperation response)
public void remoteCallFailed(MasterProcedureEnv env, ServerName serverName, java.io.IOException exception)
protected boolean addToRemoteDispatcher(MasterProcedureEnv env, ServerName targetServer)
protected void reportTransition(MasterProcedureEnv env, ServerName serverName, TransitionCode code, long seqId) throws UnexpectedStateException
UnexpectedStateException
protected boolean isServerOnline(MasterProcedureEnv env, RegionStates.RegionStateNode regionNode)
protected boolean isServerOnline(MasterProcedureEnv env, ServerName serverName)
protected void toStringState(java.lang.StringBuilder builder)
protected Procedure[] execute(MasterProcedureEnv env) throws ProcedureSuspendedException
ProcedureSuspendedException
protected boolean setTimeoutFailure(MasterProcedureEnv env)
protected void rollback(MasterProcedureEnv env)
protected abstract boolean isRollbackSupported(RegionTransitionState state)
protected boolean abort(MasterProcedureEnv env)
protected LockState acquireLock(MasterProcedureEnv env)
protected void releaseLock(MasterProcedureEnv env)
protected boolean holdLock(MasterProcedureEnv env)
protected boolean hasLock(MasterProcedureEnv env)
protected boolean shouldWaitClientAck(MasterProcedureEnv env)
public abstract ServerName getServer(MasterProcedureEnv env)