This is an automated email from the ASF dual-hosted git repository.
psomogyi pushed a commit to branch branch-2.4
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.4 by this push:
new f0c857a7846 HBASE-26320 Implement a separate thread pool for the
LogCleaner (#4895)
f0c857a7846 is described below
commit f0c857a784687140c688a90c775ec5ff982710b4
Author: Peter Somogyi <[email protected]>
AuthorDate: Sun Nov 27 19:14:44 2022 +0100
HBASE-26320 Implement a separate thread pool for the LogCleaner (#4895)
This avoids starvation when the archive directory is large and takes a long
time
to iterate through.
Signed-off-by: Duo Zhang <[email protected]>
Signed-off-by: Anoop Sam John <[email protected]>
Signed-off-by: Pankaj <[email protected]>
Co-authored-by: Xiaolin Ha <[email protected]>
---
.../org/apache/hadoop/hbase/master/HMaster.java | 32 ++++++++-----
.../hadoop/hbase/master/cleaner/CleanerChore.java | 13 ++++--
.../hadoop/hbase/master/cleaner/DirScanPool.java | 54 +++++++++++++++++-----
.../hadoop/hbase/backup/TestHFileArchiving.java | 2 +-
.../example/TestZooKeeperTableArchiveClient.java | 2 +-
.../hbase/master/cleaner/TestCleanerChore.java | 53 ++++++++++++++++++++-
.../hbase/master/cleaner/TestHFileCleaner.java | 2 +-
.../hbase/master/cleaner/TestHFileLinkCleaner.java | 2 +-
.../hbase/master/cleaner/TestLogsCleaner.java | 2 +-
.../hbase/master/region/MasterRegionTestBase.java | 10 ++--
.../master/region/TestMasterRegionCompaction.java | 2 +-
.../master/region/TestMasterRegionWALCleaner.java | 2 +-
.../hbase/master/snapshot/TestSnapshotManager.java | 2 +-
13 files changed, 140 insertions(+), 38 deletions(-)
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index 736b34b1870..41fc99b537b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -344,7 +344,10 @@ public class HMaster extends HRegionServer implements
MasterServices {
private HbckChore hbckChore;
CatalogJanitor catalogJanitorChore;
- private DirScanPool cleanerPool;
+ // Threadpool for scanning the archive directory, used by the HFileCleaner
+ private DirScanPool hfileCleanerPool;
+ // Threadpool for scanning the Old logs directory, used by the LogCleaner
+ private DirScanPool logCleanerPool;
private LogCleaner logCleaner;
private HFileCleaner hfileCleaner;
private ReplicationBarrierCleaner replicationBarrierCleaner;
@@ -1075,7 +1078,8 @@ public class HMaster extends HRegionServer implements
MasterServices {
(System.currentTimeMillis() - masterActiveTime) / 1000.0f));
this.masterFinishedInitializationTime = System.currentTimeMillis();
configurationManager.registerObserver(this.balancer);
- configurationManager.registerObserver(this.cleanerPool);
+ configurationManager.registerObserver(this.hfileCleanerPool);
+ configurationManager.registerObserver(this.logCleanerPool);
configurationManager.registerObserver(this.hfileCleaner);
configurationManager.registerObserver(this.logCleaner);
configurationManager.registerObserver(this.regionsRecoveryConfigManager);
@@ -1416,21 +1420,23 @@ public class HMaster extends HRegionServer implements
MasterServices {
this.executorService.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS,
1);
startProcedureExecutor();
- // Create cleaner thread pool
- cleanerPool = new DirScanPool(conf);
+ // Create log cleaner thread pool
+ logCleanerPool = DirScanPool.getLogCleanerScanPool(conf);
+ Map<String, Object> params = new HashMap<>();
+ params.put(MASTER, this);
// Start log cleaner thread
int cleanerInterval =
conf.getInt(HBASE_MASTER_CLEANER_INTERVAL,
DEFAULT_HBASE_MASTER_CLEANER_INTERVAL);
this.logCleaner = new LogCleaner(cleanerInterval, this, conf,
- getMasterWalManager().getFileSystem(),
getMasterWalManager().getOldLogDir(), cleanerPool);
+ getMasterWalManager().getFileSystem(),
getMasterWalManager().getOldLogDir(), logCleanerPool);
getChoreService().scheduleChore(logCleaner);
// start the hfile archive cleaner thread
Path archiveDir = HFileArchiveUtil.getArchivePath(conf);
- Map<String, Object> params = new HashMap<>();
- params.put(MASTER, this);
+ // Create archive cleaner thread pool
+ hfileCleanerPool = DirScanPool.getHFileCleanerScanPool(conf);
this.hfileCleaner = new HFileCleaner(cleanerInterval, this, conf,
- getMasterFileSystem().getFileSystem(), archiveDir, cleanerPool, params);
+ getMasterFileSystem().getFileSystem(), archiveDir, hfileCleanerPool,
params);
getChoreService().scheduleChore(hfileCleaner);
// Regions Reopen based on very high storeFileRefCount is considered
enabled
@@ -1483,9 +1489,13 @@ public class HMaster extends HRegionServer implements
MasterServices {
this.mobCompactThread.close();
}
super.stopServiceThreads();
- if (cleanerPool != null) {
- cleanerPool.shutdownNow();
- cleanerPool = null;
+ if (hfileCleanerPool != null) {
+ hfileCleanerPool.shutdownNow();
+ hfileCleanerPool = null;
+ }
+ if (logCleanerPool != null) {
+ logCleanerPool.shutdownNow();
+ logCleanerPool = null;
}
LOG.debug("Stopping service threads");
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 f54c30c6e0e..469ad518919 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
@@ -57,12 +57,19 @@ public abstract class CleanerChore<T extends
FileCleanerDelegate> extends Schedu
private static final int AVAIL_PROCESSORS =
Runtime.getRuntime().availableProcessors();
/**
- * If it is an integer and >= 1, it would be the size; if 0.0 < size <= 1.0,
size would be
- * available processors * size. Pay attention that 1.0 is different from 1,
former indicates it
- * will use 100% of cores, while latter will use only 1 thread for chore to
scan dir.
+ * Configures the threadpool used for scanning the archive directory for the
HFileCleaner If it is
+ * an integer and >= 1, it would be the size; if 0.0 < size <= 1.0, size
would be available
+ * processors * size. Pay attention that 1.0 is different from 1, former
indicates it will use
+ * 100% of cores, while latter will use only 1 thread for chore to scan dir.
*/
public static final String CHORE_POOL_SIZE =
"hbase.cleaner.scan.dir.concurrent.size";
static final String DEFAULT_CHORE_POOL_SIZE = "0.25";
+ /**
+ * Configures the threadpool used for scanning the Old logs directory for
the LogCleaner Follows
+ * the same configuration mechanism as CHORE_POOL_SIZE, but has a default of
1 thread.
+ */
+ 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.
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/DirScanPool.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/DirScanPool.java
index b95a459e59b..0a6b2efdf5d 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/DirScanPool.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/cleaner/DirScanPool.java
@@ -32,27 +32,48 @@ import
org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFacto
* The thread pool used for scan directories
*/
@InterfaceAudience.Private
-public class DirScanPool implements ConfigurationObserver {
+public final class DirScanPool implements ConfigurationObserver {
private static final Logger LOG = LoggerFactory.getLogger(DirScanPool.class);
private volatile int size;
private final ThreadPoolExecutor pool;
private int cleanerLatch;
private boolean reconfigNotification;
+ private Type dirScanPoolType;
+ private final String name;
- public DirScanPool(Configuration conf) {
- String poolSize = conf.get(CleanerChore.CHORE_POOL_SIZE,
CleanerChore.DEFAULT_CHORE_POOL_SIZE);
+ private enum Type {
+ LOG_CLEANER(CleanerChore.LOG_CLEANER_CHORE_SIZE,
+ CleanerChore.DEFAULT_LOG_CLEANER_CHORE_POOL_SIZE),
+ HFILE_CLEANER(CleanerChore.CHORE_POOL_SIZE,
CleanerChore.DEFAULT_CHORE_POOL_SIZE);
+
+ private final String cleanerPoolSizeConfigName;
+ private final String cleanerPoolSizeConfigDefault;
+
+ private Type(String cleanerPoolSizeConfigName, String
cleanerPoolSizeConfigDefault) {
+ this.cleanerPoolSizeConfigName = cleanerPoolSizeConfigName;
+ this.cleanerPoolSizeConfigDefault = cleanerPoolSizeConfigDefault;
+ }
+ }
+
+ private DirScanPool(Configuration conf, Type dirScanPoolType) {
+ this.dirScanPoolType = dirScanPoolType;
+ this.name = dirScanPoolType.name().toLowerCase();
+ String poolSize = conf.get(dirScanPoolType.cleanerPoolSizeConfigName,
+ dirScanPoolType.cleanerPoolSizeConfigDefault);
size = CleanerChore.calculatePoolSize(poolSize);
// poolSize may be 0 or 0.0 from a careless configuration,
// double check to make sure.
- size = size == 0 ?
CleanerChore.calculatePoolSize(CleanerChore.DEFAULT_CHORE_POOL_SIZE) : size;
- pool = initializePool(size);
- LOG.info("Cleaner pool size is {}", size);
+ size = size == 0
+ ?
CleanerChore.calculatePoolSize(dirScanPoolType.cleanerPoolSizeConfigDefault)
+ : size;
+ pool = initializePool(size, name);
+ LOG.info("{} Cleaner pool size is {}", name, size);
cleanerLatch = 0;
}
- private static ThreadPoolExecutor initializePool(int size) {
+ private static ThreadPoolExecutor initializePool(int size, String name) {
return Threads.getBoundedCachedThreadPool(size, 1, TimeUnit.MINUTES,
- new
ThreadFactoryBuilder().setNameFormat("dir-scan-pool-%d").setDaemon(true)
+ new ThreadFactoryBuilder().setNameFormat(name +
"-dir-scan-pool-%d").setDaemon(true)
.setUncaughtExceptionHandler(Threads.LOGGING_EXCEPTION_HANDLER).build());
}
@@ -62,10 +83,11 @@ public class DirScanPool implements ConfigurationObserver {
*/
@Override
public synchronized void onConfigurationChange(Configuration conf) {
- int newSize = CleanerChore.calculatePoolSize(
- conf.get(CleanerChore.CHORE_POOL_SIZE,
CleanerChore.DEFAULT_CHORE_POOL_SIZE));
+ int newSize =
CleanerChore.calculatePoolSize(conf.get(dirScanPoolType.cleanerPoolSizeConfigName,
+ dirScanPoolType.cleanerPoolSizeConfigDefault));
if (newSize == size) {
- LOG.trace("Size from configuration is same as previous={}, no need to
update.", newSize);
+ LOG.trace("{} Cleaner Size from configuration is same as previous={}, no
need to update.",
+ name, newSize);
return;
}
size = newSize;
@@ -108,11 +130,19 @@ public class DirScanPool implements ConfigurationObserver
{
break;
}
}
- LOG.info("Update chore's pool size from {} to {}", pool.getPoolSize(),
size);
+ LOG.info("Update {} chore's pool size from {} to {}", name,
pool.getPoolSize(), size);
pool.setCorePoolSize(size);
}
public int getSize() {
return size;
}
+
+ public static DirScanPool getHFileCleanerScanPool(Configuration conf) {
+ return new DirScanPool(conf, Type.HFILE_CLEANER);
+ }
+
+ public static DirScanPool getLogCleanerScanPool(Configuration conf) {
+ return new DirScanPool(conf, Type.LOG_CLEANER);
+ }
}
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java
index 21e7e52bf35..5e1abd90c75 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java
@@ -108,7 +108,7 @@ public class TestHFileArchiving {
// We don't want the cleaner to remove files. The tests do that.
UTIL.getMiniHBaseCluster().getMaster().getHFileCleaner().cancel(true);
- POOL = new DirScanPool(UTIL.getConfiguration());
+ POOL = DirScanPool.getHFileCleanerScanPool(UTIL.getConfiguration());
}
private static void setupConf(Configuration conf) {
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/example/TestZooKeeperTableArchiveClient.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/example/TestZooKeeperTableArchiveClient.java
index cd6f6f368eb..ab1c41c1f08 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/example/TestZooKeeperTableArchiveClient.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/example/TestZooKeeperTableArchiveClient.java
@@ -104,7 +104,7 @@ public class TestZooKeeperTableArchiveClient {
String archivingZNode =
ZKTableArchiveClient.getArchiveZNode(UTIL.getConfiguration(), watcher);
ZKUtil.createWithParents(watcher, archivingZNode);
rss = mock(RegionServerServices.class);
- POOL = new DirScanPool(UTIL.getConfiguration());
+ POOL = DirScanPool.getHFileCleanerScanPool(UTIL.getConfiguration());
}
private static void setupConf(Configuration conf) {
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestCleanerChore.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestCleanerChore.java
index 150bf66be4c..10c381615c5 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestCleanerChore.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestCleanerChore.java
@@ -62,7 +62,7 @@ public class TestCleanerChore {
@BeforeClass
public static void setup() {
- POOL = new DirScanPool(UTIL.getConfiguration());
+ POOL = DirScanPool.getHFileCleanerScanPool(UTIL.getConfiguration());
}
@AfterClass
@@ -470,6 +470,57 @@ public class TestCleanerChore {
t.join();
}
+ @Test
+ public void testOnConfigurationChangeLogCleaner() throws Exception {
+ int availableProcessorNum = Runtime.getRuntime().availableProcessors();
+ if (availableProcessorNum == 1) { // no need to run this test
+ return;
+ }
+
+ DirScanPool pool =
DirScanPool.getLogCleanerScanPool(UTIL.getConfiguration());
+
+ // have at least 2 available processors/cores
+ int initPoolSize = availableProcessorNum / 2;
+ int changedPoolSize = availableProcessorNum;
+
+ Stoppable stop = new StoppableImplementation();
+ Configuration conf = UTIL.getConfiguration();
+ Path testDir = UTIL.getDataTestDir();
+ FileSystem fs = UTIL.getTestFileSystem();
+ String confKey = "hbase.test.cleaner.delegates";
+ conf.set(confKey, AlwaysDelete.class.getName());
+ conf.set(CleanerChore.LOG_CLEANER_CHORE_SIZE,
String.valueOf(initPoolSize));
+ final AllValidPaths chore =
+ new AllValidPaths("test-file-cleaner", stop, conf, fs, testDir, confKey,
pool);
+ chore.setEnabled(true);
+ // Create subdirs under testDir
+ int dirNums = 6;
+ Path[] subdirs = new Path[dirNums];
+ for (int i = 0; i < dirNums; i++) {
+ subdirs[i] = new Path(testDir, "subdir-" + i);
+ fs.mkdirs(subdirs[i]);
+ }
+ // Under each subdirs create 6 files
+ for (Path subdir : subdirs) {
+ createFiles(fs, subdir, 6);
+ }
+ // Start chore
+ Thread t = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ chore.chore();
+ }
+ });
+ t.setDaemon(true);
+ t.start();
+ // Change size of chore's pool
+ conf.set(CleanerChore.LOG_CLEANER_CHORE_SIZE,
String.valueOf(changedPoolSize));
+ pool.onConfigurationChange(conf);
+ assertEquals(changedPoolSize, chore.getChorePoolSize());
+ // Stop chore
+ t.join();
+ }
+
@Test
public void testMinimumNumberOfThreads() throws Exception {
Configuration conf = UTIL.getConfiguration();
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileCleaner.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileCleaner.java
index 6982248a3c0..1a491977033 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileCleaner.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileCleaner.java
@@ -75,7 +75,7 @@ public class TestHFileCleaner {
public static void setupCluster() throws Exception {
// have to use a minidfs cluster because the localfs doesn't modify file
times correctly
UTIL.startMiniDFSCluster(1);
- POOL = new DirScanPool(UTIL.getConfiguration());
+ POOL = DirScanPool.getHFileCleanerScanPool(UTIL.getConfiguration());
}
@AfterClass
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileLinkCleaner.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileLinkCleaner.java
index b826b065d47..87d34dca868 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileLinkCleaner.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestHFileLinkCleaner.java
@@ -70,7 +70,7 @@ public class TestHFileLinkCleaner {
@BeforeClass
public static void setUp() {
- POOL = new DirScanPool(TEST_UTIL.getConfiguration());
+ POOL = DirScanPool.getHFileCleanerScanPool(TEST_UTIL.getConfiguration());
}
@AfterClass
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestLogsCleaner.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestLogsCleaner.java
index b493e734826..1947ed90200 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestLogsCleaner.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/cleaner/TestLogsCleaner.java
@@ -90,7 +90,7 @@ public class TestLogsCleaner {
public static void setUpBeforeClass() throws Exception {
TEST_UTIL.startMiniZKCluster();
TEST_UTIL.startMiniDFSCluster(1);
- POOL = new DirScanPool(TEST_UTIL.getConfiguration());
+ POOL = DirScanPool.getLogCleanerScanPool(TEST_UTIL.getConfiguration());
}
@AfterClass
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/MasterRegionTestBase.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/MasterRegionTestBase.java
index d006bcc2158..abf4a308bd6 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/MasterRegionTestBase.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/MasterRegionTestBase.java
@@ -47,7 +47,9 @@ public class MasterRegionTestBase {
protected ChoreService choreService;
- protected DirScanPool cleanerPool;
+ protected DirScanPool hfileCleanerPool;
+
+ protected DirScanPool logCleanerPool;
protected static byte[] CF1 = Bytes.toBytes("f1");
@@ -87,7 +89,8 @@ public class MasterRegionTestBase {
protected void createMasterRegion() throws IOException {
configure(htu.getConfiguration());
choreService = new ChoreService(getClass().getSimpleName());
- cleanerPool = new DirScanPool(htu.getConfiguration());
+ hfileCleanerPool =
DirScanPool.getHFileCleanerScanPool(htu.getConfiguration());
+ logCleanerPool = DirScanPool.getLogCleanerScanPool(htu.getConfiguration());
Server server = mock(Server.class);
when(server.getConfiguration()).thenReturn(htu.getConfiguration());
when(server.getServerName())
@@ -110,7 +113,8 @@ public class MasterRegionTestBase {
@After
public void tearDown() throws IOException {
region.close(true);
- cleanerPool.shutdownNow();
+ hfileCleanerPool.shutdownNow();
+ logCleanerPool.shutdownNow();
choreService.shutdown();
htu.cleanupTestDir();
}
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionCompaction.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionCompaction.java
index 316f369aa13..8c952262aaa 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionCompaction.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionCompaction.java
@@ -76,7 +76,7 @@ public class TestMasterRegionCompaction extends
MasterRegionTestBase {
public boolean isStopped() {
return stopped;
}
- }, conf, fs, globalArchivePath, cleanerPool);
+ }, conf, fs, globalArchivePath, hfileCleanerPool);
choreService.scheduleChore(hfileCleaner);
}
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java
index fbe1b005233..b82f6f26c84 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/region/TestMasterRegionWALCleaner.java
@@ -72,7 +72,7 @@ public class TestMasterRegionWALCleaner extends
MasterRegionTestBase {
public boolean isStopped() {
return stopped;
}
- }, conf, fs, globalWALArchiveDir, cleanerPool);
+ }, conf, fs, globalWALArchiveDir, logCleanerPool);
choreService.scheduleChore(logCleaner);
}
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.java
index af6a5b24f7c..feae6a87deb 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.java
@@ -234,7 +234,7 @@ public class TestSnapshotManager {
// Initialize cleaner
HFileCleaner cleaner = new HFileCleaner(10000,
Mockito.mock(Stoppable.class), conf, fs,
- archiveDir, new DirScanPool(UTIL.getConfiguration()));
+ archiveDir,
DirScanPool.getHFileCleanerScanPool(UTIL.getConfiguration()));
// Link backref and HFile cannot be removed
cleaner.choreForTesting();
assertTrue(fs.exists(linkBackRef));