From 17eeaef6d96f3d70fba26f37216b75efc35b987e Mon Sep 17 00:00:00 2001 From: Mohammad Arshad Date: Thu, 3 Sep 2020 15:46:10 +0530 Subject: [PATCH] HBASE-24940: runCatalogJanitor() API should return -1 to indicate already running status Closes #2331 Signed-off-by: Viraj Jasani --- .../org/apache/hadoop/hbase/client/Admin.java | 2 +- .../hadoop/hbase/master/CatalogJanitor.java | 4 ++- .../hbase/master/TestCatalogJanitor.java | 25 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java index 20b1fc08868..d76ca51d08f 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java @@ -1366,7 +1366,7 @@ public interface Admin extends Abortable, Closeable { /** * Ask for a scan of the catalog table. * - * @return the number of entries cleaned + * @return the number of entries cleaned. Returns -1 if previous run is in progress. * @throws IOException if a remote or network exception occurs * @deprecated Since 2.0.0. Will be removed in 3.0.0. Use {@link #runCatalogJanitor()}} * instead. diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java index af413f3f5bd..33ba38285d4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java @@ -160,6 +160,7 @@ public class CatalogJanitor extends ScheduledChore { * Run janitorial scan of catalog hbase:meta table looking for * garbage to collect. * @return How many items gc'd whether for merge or split. + * Returns -1 if previous scan is in progress. */ @VisibleForTesting public int scan() throws IOException { @@ -167,7 +168,8 @@ public class CatalogJanitor extends ScheduledChore { try { if (!alreadyRunning.compareAndSet(false, true)) { LOG.debug("CatalogJanitor already running"); - return gcs; + // -1 indicates previous scan is in progress + return -1; } this.lastReport = scanForReport(); if (!this.lastReport.isEmpty()) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java index 97a0f6fc301..5486817fe14 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java @@ -25,6 +25,8 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.NavigableMap; import java.util.Objects; @@ -555,6 +557,29 @@ public class TestCatalogJanitor { assertArchiveEqualToOriginal(storeFiles, archivedStoreFiles, fs, true); } + @Test + public void testAlreadyRunningStatus() throws Exception { + int numberOfThreads = 2; + List gcValues = new ArrayList<>(); + Thread[] threads = new Thread[numberOfThreads]; + for (int i = 0; i < numberOfThreads; i++) { + threads[i] = new Thread(() -> { + try { + gcValues.add(janitor.scan()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + for (int i = 0; i < numberOfThreads; i++) { + threads[i].start(); + } + for (int i = 0; i < numberOfThreads; i++) { + threads[i].join(); + } + assertTrue("One janitor.scan() call should have returned -1", gcValues.contains(-1)); + } + private FileStatus[] addMockStoreFiles(int count, MasterServices services, Path storedir) throws IOException { // get the existing store files