@Override
    public Void call() throws Exception {
      LOG.debug("Starting region operation on " + region);
      region.startRegionOperation();
      try {
        LOG.debug("Flush region " + region.toString() + " started...");
        if (families == null || families.isEmpty()) {
          region.flush(true);
        } else {
          region.flushcache(families, false, FlushLifeCycleTracker.DUMMY);
        }
        // TODO: flush result is not checked?
      } finally {
        LOG.debug("Closing region operation on " + region);
        region.closeRegionOperation();
      }
      return null;
    }
This flush region implementation uses the distributed procedure framework to flush table regions.
Its acquireBarrier stage does nothing. Its insideBarrier stage flushes the regions.
hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/flush/FlushTableSubprocedure.java