public CompletableFuture<Void> serverCrashed(MasterProcedureEnv env, RegionStateNode regionNode,
    ServerName serverName, boolean forceNewPlan) {
    this.forceNewPlan = forceNewPlan;
    if (remoteProc != null) {
      // this means we are waiting for the sub procedure, so wake it up
      try {
        remoteProc.serverCrashed(env, regionNode, serverName);
      } catch (Exception e) {
        return FutureUtils.failedFuture(e);
      }
      return CompletableFuture.completedFuture(null);
    } else {
      if (regionNode.isInState(State.ABNORMALLY_CLOSED)) {
        // should be a retry, where we have already changed the region state to abnormally closed
        return CompletableFuture.completedFuture(null);
      } else {
        // we are in RUNNING state, just update the region state, and we will process it later.
        return env.getAssignmentManager().regionClosedAbnormally(regionNode);
      }
    }
  }
At end of timeout, wake ourselves up so we run again.
hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java