From 584416226cc3b327f6a29307bb0d3f9d89cf5635 Mon Sep 17 00:00:00 2001 From: zhangduo Date: Fri, 8 Feb 2019 15:29:11 +0800 Subject: [PATCH] HBASE-21859 Add clearRegionLocationCache method for AsyncConnection --- .../apache/hadoop/hbase/client/AsyncConnection.java | 10 ++++++++++ .../hadoop/hbase/client/AsyncConnectionImpl.java | 5 +++++ .../hadoop/hbase/client/AsyncNonMetaRegionLocator.java | 4 ++++ .../apache/hadoop/hbase/client/AsyncRegionLocator.java | 5 +++++ .../hadoop/hbase/client/TestAsyncRegionLocator.java | 6 ++++++ 5 files changed, 30 insertions(+) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java index 5640eb337f..564d4db3d5 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java @@ -52,6 +52,16 @@ public interface AsyncConnection extends Closeable { */ AsyncTableRegionLocator getRegionLocator(TableName tableName); + /** + * Clear all the entries in the region location cache, for all the tables. + *

+ * If you only want to clear the cache for a specific table, use + * {@link AsyncTableRegionLocator#clearRegionLocationCache()}. + *

+ * This may cause performance issue so use it with caution. + */ + void clearRegionLocationCache(); + /** * Retrieve an {@link AsyncTable} implementation for accessing a table. *

diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java index 4a32546160..07f62a8c9e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java @@ -353,4 +353,9 @@ class AsyncConnectionImpl implements AsyncConnection { return new HBaseHbck(MasterProtos.HbckService.newBlockingStub( rpcClient.createBlockingRpcChannel(masterServer, user, rpcTimeout)), rpcControllerFactory); } + + @Override + public void clearRegionLocationCache() { + locator.clearCache(); + } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java index 1a1f32adb5..5d5c7c3d6c 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java @@ -569,6 +569,10 @@ class AsyncNonMetaRegionLocator { } } + void clearCache() { + cache.clear(); + } + // only used for testing whether we have cached the location for a region. @VisibleForTesting RegionLocations getRegionLocationInCache(TableName tableName, byte[] row) { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocator.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocator.java index cc2a21b633..3eb44b7114 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocator.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocator.java @@ -159,4 +159,9 @@ class AsyncRegionLocator { nonMetaRegionLocator.clearCache(tableName); } } + + void clearCache() { + metaRegionLocator.clearCache(); + nonMetaRegionLocator.clearCache(); + } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java index 0b51ce8723..0a94def619 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.java @@ -49,6 +49,7 @@ import org.apache.hadoop.hbase.testclassification.ClientTests; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Threads; +import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -109,6 +110,11 @@ public class TestAsyncRegionLocator { TEST_UTIL.shutdownMiniCluster(); } + @After + public void tearDownAfterTest() { + LOCATOR.clearCache(); + } + @Test public void testTimeout() throws InterruptedException, ExecutionException { SLEEP_MS = 1000; -- 2.17.1