diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/CleanerChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/CleanerChore.java index 71fe53815496..83ead85eaaf6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/CleanerChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/CleanerChore.java @@ -71,6 +71,13 @@ public abstract class CleanerChore extends Schedu */ public static final String LOG_CLEANER_CHORE_SIZE = "hbase.log.cleaner.scan.dir.concurrent.size"; static final String DEFAULT_LOG_CLEANER_CHORE_POOL_SIZE = "1"; + /** + * Enable the CleanerChore to sort the subdirectories by consumed space and start the cleaning + * with the largest subdirectory. Enabled by default. + */ + public static final String LOG_CLEANER_CHORE_DIRECTORY_SORTING = + "hbase.cleaner.directory.sorting"; + static final boolean DEFAULT_LOG_CLEANER_CHORE_DIRECTORY_SORTING = true; private final DirScanPool pool; @@ -81,6 +88,7 @@ public abstract class CleanerChore extends Schedu private final AtomicBoolean enabled = new AtomicBoolean(true); protected List cleanersChain; protected List excludeDirs; + private boolean sortDirectories; public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf, FileSystem fs, Path oldFileDir, String confKey, DirScanPool pool) { @@ -122,6 +130,8 @@ public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Confi if (excludeDirs != null) { LOG.info("Cleaner {} excludes sub dirs: {}", name, excludeDirs); } + sortDirectories = conf.getBoolean(LOG_CLEANER_CHORE_DIRECTORY_SORTING, + DEFAULT_LOG_CLEANER_CHORE_DIRECTORY_SORTING); initCleanerChain(confKey); } @@ -429,7 +439,9 @@ private void traverseAndDelete(Path dir, boolean root, CompletableFuture> futures = new ArrayList<>(); if (!subDirs.isEmpty()) { - sortByConsumedSpace(subDirs); + if (sortDirectories) { + sortByConsumedSpace(subDirs); + } // Submit the request of sub-directory deletion. subDirs.forEach(subDir -> { if (!shouldExclude(subDir)) {