private StoreFileTrackerState checkState(Configuration conf, String dstSFT) {
    // there are 4 possible conditions:
    // 1. The table or family has already made use of the dstSFT. In this way we just finish the
    // procedure.
    // 2. The table or family is not using the dstSFT but also not using migration SFT,
    // then we just go to the MODIFY_STORE_FILE_TRACKER_MIGRATION state.
    // 3. The table or family has already been using migration SFT and the dst SFT is what we
    // expect, just go to MODIFY_STORE_FILE_TRACKER_FINISH.
    // 4. The table or family is using migration SFT and the dst SFT is not what we
    // expect, then need to schedule a MTP to change it to the dst SFT of the current migration
    // SFT first, and then go to MODIFY_STORE_FILE_TRACKER_MIGRATION.
    Class<? extends StoreFileTracker> clazz = StoreFileTrackerFactory.getTrackerClass(conf);
    Class<? extends StoreFileTracker> dstSFTClass = StoreFileTrackerFactory.getTrackerClass(dstSFT);
    if (clazz.equals(dstSFTClass)) {
      return StoreFileTrackerState.ALREADY_FINISHED;
    }
    if (!MigrationStoreFileTracker.class.isAssignableFrom(clazz)) {
      return StoreFileTrackerState.NEED_START_MIGRATION;
    }
    Class<? extends StoreFileTracker> currentDstSFT = StoreFileTrackerFactory
      .getStoreFileTrackerClassForMigration(conf, MigrationStoreFileTracker.DST_IMPL);
    if (currentDstSFT.equals(dstSFTClass)) {
      return StoreFileTrackerState.NEED_FINISH_MIGRATION;
    } else {
      return StoreFileTrackerState.NEED_FINISH_PREVIOUS_MIGRATION_FIRST;
    }
  }
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