This is an automated email from the ASF dual-hosted git repository. vjasani pushed a commit to branch branch-1 in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-1 by this push: new 76db1e1 HBASE-24940: runCatalogJanitor() API should return -1 to indicate already running status 76db1e1 is described below commit 76db1e1791cfa2a6685580af254a8180363a8dba Author: Mohammad Arshad <ars...@apache.org> AuthorDate: Thu Sep 3 15:46:10 2020 +0530 HBASE-24940: runCatalogJanitor() API should return -1 to indicate already running status Closes #2331 Co-authored-by: Viraj Jasani <vjas...@apache.org> Signed-off-by: Viraj Jasani <vjas...@apache.org> --- .../java/org/apache/hadoop/hbase/client/Admin.java | 2 +- .../apache/hadoop/hbase/master/CatalogJanitor.java | 4 ++- .../hadoop/hbase/master/TestCatalogJanitor.java | 32 ++++++++++++++++++++++ 3 files changed, 36 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 4896df9..c32b391 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 @@ -779,7 +779,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 */ int runCatalogScan() throws IOException; 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 549c38f..911248c 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 @@ -238,7 +238,9 @@ public class CatalogJanitor extends ScheduledChore { int scan() throws IOException { try { if (!alreadyRunning.compareAndSet(false, true)) { - return 0; + LOG.debug("CatalogJanitor already running"); + // -1 indicates previous scan is in progress + return -1; } Triple<Integer, Map<HRegionInfo, Result>, Map<HRegionInfo, Result>> scanTriple = getMergedRegionsAndSplitParents(); 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 9416620..397d5a8 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 @@ -26,6 +26,7 @@ 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.SortedMap; @@ -1068,6 +1069,37 @@ public class TestCatalogJanitor { janitor.cancel(true); } + @Test + public void testAlreadyRunningStatus() throws Exception { + int numberOfThreads = 2; + final List<Integer> gcValues = new ArrayList<>(); + Thread[] threads = new Thread[numberOfThreads]; + HBaseTestingUtility hBaseTestingUtility = new HBaseTestingUtility(); + hBaseTestingUtility.getConfiguration().setInt("hbase.client.retries.number", 5); + Server server = new MockServer(hBaseTestingUtility); + MasterServices services = new MockMasterServices(server); + final CatalogJanitor catalogJanitor = new CatalogJanitor(server, services); + for (int i = 0; i < numberOfThreads; i++) { + threads[i] = new Thread(new Runnable() { + @Override + public void run() { + try { + gcValues.add(catalogJanitor.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