@Override
  protected Flow executeFromState(MasterProcedureEnv env, ModifyStoreFileTrackerState state)
    throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {
    try {
      switch (state) {
        case MODIFY_STORE_FILE_TRACKER_FINISH_PREVIOUS_MIGRATION:
          return preCheckAndTryRestoreSFT(env);
        case MODIFY_STORE_FILE_TRACKER_START_MIGRATION:
          migrate(env);
          return Flow.HAS_MORE_STATE;
        case MODIFY_STORE_FILE_TRACKER_FINISH_MIGRATION:
          finish(env);
          return Flow.NO_MORE_STATE;
        default:
          throw new UnsupportedOperationException("unhandled state=" + state);
      }
    } catch (IOException e) {
      if (isRollbackSupported(state)) {
        setFailure("master-modify-SFT", e);
      } else {
        LOG.warn("Retriable error trying to modify SFT for table={} (in state={})", getTableName(),
          state, e);
      }
    }
    return Flow.HAS_MORE_STATE;
  }
This procedure is used to change the store file tracker implementation.
<p/>
Typically we need to schedule two {@link ModifyTableProcedure} (or three if the table is already
in {@code MIGRATION} but the {@code dstSFT} is not what we expected) to do this, so we introduce
this procedure to simplify the work of our users.
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/ModifyStoreFileTrackerProcedure.java