@Override
  public boolean isFileDeletable(FileStatus fStat) {
    try {
      // if its a directory, then it can be deleted
      if (fStat.isDirectory()) {
        return true;
      }

      Path file = fStat.getPath();

      // we need the table and region to determine if this is from a mob region
      // we don't need to worry about hfilelink back references, because the hfilelink cleaner will
      // retain them.
      Path family = file.getParent();
      Path region = family.getParent();
      Path table = region.getParent();

      TableName tableName = CommonFSUtils.getTableName(table);

      String mobRegion = MOB_REGIONS.get(tableName);
      if (mobRegion == null) {
        String tmp = MobUtils.getMobRegionInfo(tableName).getEncodedName();
        if (tmp == null) {
          LOG.error("couldn't determine mob region for table {} keeping files just in case.",
            tableName);
          return false;
        }
        mobRegion = MOB_REGIONS.putIfAbsent(tableName, tmp);
        // a return of null means that tmp is now in the map for future lookups.
        if (mobRegion == null) {
          mobRegion = tmp;
        }
        LOG.debug("Had to calculate name of mob region for table {} and it is {}", tableName,
          mobRegion);
      }

      boolean ret = !mobRegion.equals(region.getName());
      if (LOG.isDebugEnabled() && !ret) {
        LOG.debug("Keeping file '{}' because it is from mob dir", fStat.getPath());
      }
      return ret;
    } catch (RuntimeException e) {
      LOG.error("Failed to determine mob status of '{}', keeping it just in case.", fStat.getPath(),
        e);
      return false;
    }
  }
{@link BaseHFileCleanerDelegate} that prevents cleaning HFiles from a mob region keeps a map of
table name strings to mob region name strings over the life of a JVM instance. if there's churn
of unique table names we'll eat memory until Master restart.
hbase-server/src/main/java/org/apache/hadoop/hbase/mob/ManualMobMaintHFileCleaner.java