You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by bb...@apache.org on 2022/04/22 19:30:31 UTC
[hbase] branch branch-2 updated: HBASE-26942 cache region locations when getAllRegionLocations (#4364)
This is an automated email from the ASF dual-hosted git repository.
bbeaudreault pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new 8d17241ce0b HBASE-26942 cache region locations when getAllRegionLocations (#4364)
8d17241ce0b is described below
commit 8d17241ce0b8f3e0ed9bdc61bf89d4e0092d77eb
Author: Ruanhui <32...@users.noreply.github.com>
AuthorDate: Sat Apr 23 03:30:26 2022 +0800
HBASE-26942 cache region locations when getAllRegionLocations (#4364)
Co-authored-by: huiruan <hu...@tencent.com>
Signed-off-by: Duo Zhang <zh...@apache.org>
Signed-off-by: Bryan Beaudreault <bb...@apache.org>
---
.../hadoop/hbase/client/AsyncNonMetaRegionLocator.java | 2 +-
.../hadoop/hbase/client/AsyncTableRegionLocatorImpl.java | 6 +++++-
.../hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java | 14 ++++++++++++++
3 files changed, 20 insertions(+), 2 deletions(-)
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 5798ee5f1fb..6896a2970b0 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
@@ -649,7 +649,7 @@ class AsyncNonMetaRegionLocator {
}
}
- private void addLocationToCache(HRegionLocation loc) {
+ void addLocationToCache(HRegionLocation loc) {
addToCache(getTableCache(loc.getRegion().getTable()), createRegionLocations(loc));
}
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableRegionLocatorImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableRegionLocatorImpl.java
index d5b275d2a77..db7d78cab93 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableRegionLocatorImpl.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncTableRegionLocatorImpl.java
@@ -18,6 +18,7 @@
package org.apache.hadoop.hbase.client;
import static org.apache.hadoop.hbase.trace.TraceUtil.tracedFuture;
+import static org.apache.hadoop.hbase.util.FutureUtils.addListener;
import java.util.Arrays;
import java.util.List;
@@ -61,8 +62,11 @@ class AsyncTableRegionLocatorImpl implements AsyncTableRegionLocator {
return conn.registry.getMetaRegionLocations()
.thenApply(locs -> Arrays.asList(locs.getRegionLocations()));
}
- return AsyncMetaTableAccessor
+ CompletableFuture<List<HRegionLocation>> future = AsyncMetaTableAccessor
.getTableHRegionLocations(conn.getTable(TableName.META_TABLE_NAME), tableName);
+ addListener(future, (locs, error) -> locs.forEach(loc -> conn.getLocator()
+ .getNonMetaRegionLocator().addLocationToCache(loc)));
+ return future;
}, getClass().getSimpleName() + ".getAllRegionLocations");
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java
index 79ab476de7a..21110f7fd4d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java
@@ -25,6 +25,7 @@ import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import java.io.IOException;
@@ -459,4 +460,17 @@ public class TestAsyncNonMetaRegionLocator {
IntStream.range(0, 100).parallel()
.forEach(i -> locator.updateCachedLocationOnError(loc, new NotServingRegionException()));
}
+
+ @Test
+ public void testCacheLocationWhenGetAllLocations() throws Exception {
+ createMultiRegionTable();
+ AsyncConnectionImpl conn = (AsyncConnectionImpl)
+ ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get();
+ conn.getRegionLocator(TABLE_NAME).getAllRegionLocations().get();
+ List<RegionInfo> regions = TEST_UTIL.getAdmin().getRegions(TABLE_NAME);
+ for (RegionInfo region : regions) {
+ assertNotNull(conn.getLocator().getNonMetaRegionLocator()
+ .getRegionLocationInCache(TABLE_NAME, region.getStartKey()));
+ }
+ }
}