private Collection<HStoreFile> getExpiredStores(Collection<HStoreFile> files,
    Collection<HStoreFile> filesCompacting) {
    long currentTime = EnvironmentEdgeManager.currentTime();
    Collection<HStoreFile> expiredStores = new ArrayList<>();
    for (HStoreFile sf : files) {
      if (isEmptyStoreFile(sf) && !filesCompacting.contains(sf)) {
        expiredStores.add(sf);
        continue;
      }
      // Check MIN_VERSIONS is in HStore removeUnneededFiles
      long maxTs = sf.getReader().getMaxTimestamp();
      long maxTtl = storeConfigInfo.getStoreFileTtl();
      if (maxTtl == Long.MAX_VALUE || (currentTime - maxTtl < maxTs)) {
        continue;
      } else if (filesCompacting == null || !filesCompacting.contains(sf)) {
        expiredStores.add(sf);
      }
    }
    return expiredStores;
  }
The FIFOCompactionPolicy only choose the TTL expired store files as the compaction candidates.
If all the store files are TTL expired, then the compaction will generate a new empty file.
While its max timestamp will be Long.MAX_VALUE. If not considered separately, the store file
will never be archived because its TTL will be never expired. So we'll check the empty store
file separately (See HBASE-21504).
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/FIFOCompactionPolicy.java