@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "REC_CATCH_EXCEPTION",
      justification = "Intentional")
  @Override
  public int run(String[] args) throws Exception {
    if (args.length != 2) {
      printUsage();
      return 1;
    }
    String tableName = args[0];
    String familyName = args[1];
    TableName tn = TableName.valueOf(tableName);
    Connection connection = ConnectionFactory.createConnection(getConf());
    Admin admin = connection.getAdmin();
    try {
      TableDescriptor htd = admin.getDescriptor(tn);
      ColumnFamilyDescriptor family = htd.getColumnFamily(Bytes.toBytes(familyName));
      if (family == null || !family.isMobEnabled()) {
        throw new IOException("Column family " + familyName + " is not a MOB column family");
      }
      if (family.getMinVersions() > 0) {
        throw new IOException(
          "The minVersions of the column family is not 0, could not be handled by this cleaner");
      }
      cleanExpiredMobFiles(htd, family);
      return 0;
    } finally {
      admin.close();
      try {
        connection.close();
      } catch (IOException e) {
        LOG.error("Failed to close the connection.", e);
      }
    }
  }
Cleans the MOB files when they're expired and their min versions are 0. If the latest timestamp
of Cells in a MOB file is older than the TTL in the column family, it's regarded as expired.
This cleaner deletes them. At a time T0, the cells in a mob file M0 are expired. If a user
starts a scan before T0, those mob cells are visible, this scan still runs after T0. At that
time T1, this mob file M0 is expired, meanwhile a cleaner starts, the M0 is archived and can be
read in the archive directory.
@param tableName The current table name.
@param family    The current family.
hbase-server/src/main/java/org/apache/hadoop/hbase/mob/ExpiredMobFileCleaner.java