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 1c686aca8b76..877b47acd104 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 @@ private void removeLocationFromCache(HRegionLocation loc) { } } - 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 35bf0e0ea330..d20e1faed0cc 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 @@ public CompletableFuture> getAllRegionLocations() { return conn.registry.getMetaRegionLocations() .thenApply(locs -> Arrays.asList(locs.getRegionLocations())); } - return ClientMetaTableAccessor + CompletableFuture> future = ClientMetaTableAccessor .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 040bc627ab9f..4118dbb1559f 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.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; @@ -460,4 +461,16 @@ public void testConcurrentUpdateCachedLocationOnError() throws Exception { 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 regions = TEST_UTIL.getAdmin().getRegions(TABLE_NAME); + for (RegionInfo region : regions) { + assertNotNull(conn.getLocator().getRegionLocationInCache(TABLE_NAME, region.getStartKey())); + } + } }