Search in sources :

Example 1 with FailedRemoteDispatchException

use of org.apache.hadoop.hbase.procedure2.FailedRemoteDispatchException in project hbase by apache.

the class RegionRemoteProcedureBase method execute.

@Override
protected Procedure<MasterProcedureEnv>[] execute(MasterProcedureEnv env) throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {
    RegionStateNode regionNode = getRegionNode(env);
    regionNode.lock();
    try {
        switch(state) {
            case REGION_REMOTE_PROCEDURE_DISPATCH:
                {
                    // The code which wakes us up also needs to lock the RSN so here we do not need to
                    // synchronize
                    // on the event.
                    ProcedureEvent<?> event = regionNode.getProcedureEvent();
                    try {
                        env.getRemoteDispatcher().addOperationToNode(targetServer, this);
                    } catch (FailedRemoteDispatchException e) {
                        LOG.warn("Can not add remote operation {} for region {} to server {}, this usually " + "because the server is alread dead, give up and mark the procedure as complete, " + "the parent procedure will take care of this.", this, region, targetServer, e);
                        unattach(env);
                        return null;
                    }
                    event.suspend();
                    event.suspendIfNotReady(this);
                    throw new ProcedureSuspendedException();
                }
            case REGION_REMOTE_PROCEDURE_REPORT_SUCCEED:
                env.getAssignmentManager().persistToMeta(regionNode);
                unattach(env);
                return null;
            case REGION_REMOTE_PROCEDURE_DISPATCH_FAIL:
                // the remote call is failed so we do not need to change the region state, just return.
                unattach(env);
                return null;
            case REGION_REMOTE_PROCEDURE_SERVER_CRASH:
                env.getAssignmentManager().regionClosedAbnormally(regionNode);
                unattach(env);
                return null;
            default:
                throw new IllegalStateException("Unknown state: " + state);
        }
    } catch (IOException e) {
        if (retryCounter == null) {
            retryCounter = ProcedureUtil.createRetryCounter(env.getMasterConfiguration());
        }
        long backoff = retryCounter.getBackoffTimeAndIncrementAttempts();
        LOG.warn("Failed updating meta, suspend {}secs {}; {};", backoff / 1000, this, regionNode, e);
        setTimeout(Math.toIntExact(backoff));
        setState(ProcedureProtos.ProcedureState.WAITING_TIMEOUT);
        skipPersistence();
        throw new ProcedureSuspendedException();
    } finally {
        regionNode.unlock();
    }
}
Also used : FailedRemoteDispatchException(org.apache.hadoop.hbase.procedure2.FailedRemoteDispatchException) ProcedureEvent(org.apache.hadoop.hbase.procedure2.ProcedureEvent) IOException(java.io.IOException) ProcedureSuspendedException(org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException)

Aggregations

IOException (java.io.IOException)1 FailedRemoteDispatchException (org.apache.hadoop.hbase.procedure2.FailedRemoteDispatchException)1 ProcedureEvent (org.apache.hadoop.hbase.procedure2.ProcedureEvent)1 ProcedureSuspendedException (org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException)1