From c73a751735a1c8bd8b38b46a0e63b6ca6c7801b4 Mon Sep 17 00:00:00 2001 From: huiruan Date: Mon, 11 Apr 2022 02:02:58 +0800 Subject: [PATCH 1/9] HBASE-26942 cache region locations when getAllRegionLocations --- .../hbase/client/AsyncNonMetaRegionLocator.java | 2 +- .../hbase/client/AsyncTableRegionLocatorImpl.java | 5 ++++- .../hbase/client/TestAsyncNonMetaRegionLocator.java | 13 +++++++++++++ 3 files changed, 18 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 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..5d124ab4c98d 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 @@ -62,7 +62,10 @@ public CompletableFuture> getAllRegionLocations() { .thenApply(locs -> Arrays.asList(locs.getRegionLocations())); } return ClientMetaTableAccessor - .getTableHRegionLocations(conn.getTable(TableName.META_TABLE_NAME), tableName); + .getTableHRegionLocations(conn.getTable(TableName.META_TABLE_NAME), tableName) + .whenComplete((locs, error) -> { + locs.forEach(loc -> conn.getLocator().getNonMetaRegionLocator().addLocationToCache(loc)); + }); }, 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())); + } + } } From 329ef8b3b2d4a673da716f1360c44af51b04c620 Mon Sep 17 00:00:00 2001 From: huiruan Date: Tue, 12 Apr 2022 23:41:45 +0800 Subject: [PATCH 2/9] replace future.whenComplete with FutureUtils.addListener --- .../client/AsyncTableRegionLocatorImpl.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) 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 5d124ab4c98d..c113c69d6a0c 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,11 +62,17 @@ public CompletableFuture> getAllRegionLocations() { return conn.registry.getMetaRegionLocations() .thenApply(locs -> Arrays.asList(locs.getRegionLocations())); } - return ClientMetaTableAccessor - .getTableHRegionLocations(conn.getTable(TableName.META_TABLE_NAME), tableName) - .whenComplete((locs, error) -> { - locs.forEach(loc -> conn.getLocator().getNonMetaRegionLocator().addLocationToCache(loc)); - }); + CompletableFuture> future = ClientMetaTableAccessor + .getTableHRegionLocations(conn.getTable(TableName.META_TABLE_NAME), tableName); + addListener(future, (locs, error) -> { + if (error != null) { + future.completeExceptionally(error); + return; + } + locs.forEach(loc -> conn.getLocator().getNonMetaRegionLocator().addLocationToCache(loc)); + future.complete(locs); + }); + return future; }, getClass().getSimpleName() + ".getAllRegionLocations"); } From 5c53f680f330df7b2ad2086e7fd370a92033806c Mon Sep 17 00:00:00 2001 From: huiruan Date: Wed, 13 Apr 2022 02:42:24 +0800 Subject: [PATCH 3/9] fix a re-complete future problem --- .../hadoop/hbase/client/AsyncTableRegionLocatorImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 c113c69d6a0c..4d40288a9052 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 @@ -62,9 +62,9 @@ public CompletableFuture> getAllRegionLocations() { return conn.registry.getMetaRegionLocations() .thenApply(locs -> Arrays.asList(locs.getRegionLocations())); } - CompletableFuture> future = ClientMetaTableAccessor - .getTableHRegionLocations(conn.getTable(TableName.META_TABLE_NAME), tableName); - addListener(future, (locs, error) -> { + CompletableFuture> future = new CompletableFuture<>(); + addListener(ClientMetaTableAccessor.getTableHRegionLocations(conn + .getTable(TableName.META_TABLE_NAME), tableName), (locs, error) -> { if (error != null) { future.completeExceptionally(error); return; From 3e1530e8f4785bf51500b57899f612f34e05c403 Mon Sep 17 00:00:00 2001 From: huiruan Date: Wed, 13 Apr 2022 17:51:52 +0800 Subject: [PATCH 4/9] add a test case for getting region locations exceptionally --- .../client/TestAsyncNonMetaRegionLocator.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) 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 4118dbb1559f..65e80293dbc4 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 @@ -26,7 +26,9 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThrows; import java.io.IOException; import java.util.Arrays; @@ -62,6 +64,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; +import org.mockito.Mockito; import org.apache.hbase.thirdparty.com.google.common.io.Closeables; @@ -473,4 +476,23 @@ public void testCacheLocationWhenGetAllLocations() throws Exception { assertNotNull(conn.getLocator().getRegionLocationInCache(TABLE_NAME, region.getStartKey())); } } + + @Test + public void testCacheLocationExceptionallyWhenGetAllLocations() throws Exception { + createMultiRegionTable(); + AsyncConnectionImpl conn = (AsyncConnectionImpl) + ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get(); + AsyncConnectionImpl spyConn = Mockito.spy(conn); + Mockito.when(spyConn.getTable(TableName.META_TABLE_NAME)) + .thenThrow(new MockedInvalidTableRuntimeException()); + assertThrows(MockedInvalidTableRuntimeException.class, () -> + spyConn.getRegionLocator(TABLE_NAME).getAllRegionLocations().get()); + List regions = TEST_UTIL.getAdmin().getRegions(TABLE_NAME); + for (RegionInfo region : regions) { + assertNull(conn.getLocator().getRegionLocationInCache(TABLE_NAME, region.getStartKey())); + } + } + + /** This is used to mock that getting all region locations completes exceptionally. */ + private static final class MockedInvalidTableRuntimeException extends RuntimeException {} } From 9ccecce2d693328a57228ede23d8934f1192af05 Mon Sep 17 00:00:00 2001 From: huiruan Date: Wed, 13 Apr 2022 22:19:23 +0800 Subject: [PATCH 5/9] fix the unrelated test case --- .../client/AsyncTableRegionLocatorImpl.java | 18 +++++++++++------- .../client/TestAsyncNonMetaRegionLocator.java | 11 +++++++---- 2 files changed, 18 insertions(+), 11 deletions(-) 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 4d40288a9052..f34e9f64bb09 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 @@ -65,13 +65,17 @@ public CompletableFuture> getAllRegionLocations() { CompletableFuture> future = new CompletableFuture<>(); addListener(ClientMetaTableAccessor.getTableHRegionLocations(conn .getTable(TableName.META_TABLE_NAME), tableName), (locs, error) -> { - if (error != null) { - future.completeExceptionally(error); - return; - } - locs.forEach(loc -> conn.getLocator().getNonMetaRegionLocator().addLocationToCache(loc)); - future.complete(locs); - }); + if (error != null) { + future.completeExceptionally(error); + return; + } + try { + locs.forEach(loc -> conn.getLocator() + .getNonMetaRegionLocator().addLocationToCache(loc)); + } finally { + future.complete(locs); + } + }); 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 65e80293dbc4..2953790e86cd 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 @@ -482,10 +482,13 @@ public void testCacheLocationExceptionallyWhenGetAllLocations() throws Exception createMultiRegionTable(); AsyncConnectionImpl conn = (AsyncConnectionImpl) ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get(); + AsyncTable metaTable = conn.getTable(TableName.META_TABLE_NAME); + AsyncTable spyMetaTable = Mockito.spy(metaTable); + Mockito.doThrow(new MockedBadScanResultException()).when(spyMetaTable) + .scan(Mockito.any(Scan.class), Mockito.any(AdvancedScanResultConsumer.class)); AsyncConnectionImpl spyConn = Mockito.spy(conn); - Mockito.when(spyConn.getTable(TableName.META_TABLE_NAME)) - .thenThrow(new MockedInvalidTableRuntimeException()); - assertThrows(MockedInvalidTableRuntimeException.class, () -> + Mockito.doReturn(spyMetaTable).when(spyConn).getTable(TableName.META_TABLE_NAME); + assertThrows(MockedBadScanResultException.class, () -> spyConn.getRegionLocator(TABLE_NAME).getAllRegionLocations().get()); List regions = TEST_UTIL.getAdmin().getRegions(TABLE_NAME); for (RegionInfo region : regions) { @@ -494,5 +497,5 @@ public void testCacheLocationExceptionallyWhenGetAllLocations() throws Exception } /** This is used to mock that getting all region locations completes exceptionally. */ - private static final class MockedInvalidTableRuntimeException extends RuntimeException {} + private static final class MockedBadScanResultException extends RuntimeException {} } From 98d106da0630df32fe23b692bc280a798da752da Mon Sep 17 00:00:00 2001 From: huiruan Date: Wed, 13 Apr 2022 22:29:58 +0800 Subject: [PATCH 6/9] catch the exception and complete future exceptionnal while adding region location cache --- .../apache/hadoop/hbase/client/AsyncTableRegionLocatorImpl.java | 2 ++ 1 file changed, 2 insertions(+) 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 f34e9f64bb09..b9347caaabf1 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 @@ -72,6 +72,8 @@ public CompletableFuture> getAllRegionLocations() { try { locs.forEach(loc -> conn.getLocator() .getNonMetaRegionLocator().addLocationToCache(loc)); + } catch (Exception e) { + future.completeExceptionally(e); } finally { future.complete(locs); } From 4f334a073518c86c732331873d51e1a19631fdbd Mon Sep 17 00:00:00 2001 From: huiruan Date: Sat, 16 Apr 2022 00:18:55 +0800 Subject: [PATCH 7/9] add a test case for getting region locations exceptionally --- .../client/TestAsyncNonMetaRegionLocator.java | 53 +++++++++++++------ 1 file changed, 38 insertions(+), 15 deletions(-) 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 2953790e86cd..85b77a75383b 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 @@ -28,9 +28,10 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.net.SocketAddress; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -39,6 +40,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseTestingUtil; import org.apache.hadoop.hbase.HRegionLocation; @@ -64,10 +66,11 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; -import org.mockito.Mockito; import org.apache.hbase.thirdparty.com.google.common.io.Closeables; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService; + @Category({ MediumTests.class, ClientTests.class }) @RunWith(Parameterized.class) public class TestAsyncNonMetaRegionLocator { @@ -480,22 +483,42 @@ public void testCacheLocationWhenGetAllLocations() throws Exception { @Test public void testCacheLocationExceptionallyWhenGetAllLocations() throws Exception { createMultiRegionTable(); - AsyncConnectionImpl conn = (AsyncConnectionImpl) - ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get(); - AsyncTable metaTable = conn.getTable(TableName.META_TABLE_NAME); - AsyncTable spyMetaTable = Mockito.spy(metaTable); - Mockito.doThrow(new MockedBadScanResultException()).when(spyMetaTable) - .scan(Mockito.any(Scan.class), Mockito.any(AdvancedScanResultConsumer.class)); - AsyncConnectionImpl spyConn = Mockito.spy(conn); - Mockito.doReturn(spyMetaTable).when(spyConn).getTable(TableName.META_TABLE_NAME); - assertThrows(MockedBadScanResultException.class, () -> - spyConn.getRegionLocator(TABLE_NAME).getAllRegionLocations().get()); + Configuration config = new Configuration(TEST_UTIL.getConfiguration()); + config.setClass(ConnectionFactory.HBASE_CLIENT_ASYNC_CONNECTION_IMPL, + BadAsyncConnectionImpl.class, AsyncConnection.class); + AsyncConnectionImpl clientConn = (AsyncConnectionImpl) + ConnectionFactory.createAsyncConnection(config).get(); + + Exception ex = null; + try { + clientConn.getRegionLocator(TABLE_NAME).getAllRegionLocations().get(); + } catch (Exception e) { + ex = e; + } + + assertNotNull(ex); + assertTrue(ex instanceof ExecutionException); + assertTrue(ex.getCause() != null && ex.getCause() instanceof RegionLocationResultException); + List regions = TEST_UTIL.getAdmin().getRegions(TABLE_NAME); for (RegionInfo region : regions) { - assertNull(conn.getLocator().getRegionLocationInCache(TABLE_NAME, region.getStartKey())); + assertNull(clientConn.getLocator() + .getRegionLocationInCache(TABLE_NAME, region.getStartKey())); } } - /** This is used to mock that getting all region locations completes exceptionally. */ - private static final class MockedBadScanResultException extends RuntimeException {} + private static final class RegionLocationResultException extends DoNotRetryIOException {} + + private static final class BadAsyncConnectionImpl extends AsyncConnectionImpl { + + public BadAsyncConnectionImpl(Configuration conf, ConnectionRegistry registry, + String clusterId, SocketAddress localAddress, User user) { + super(conf, registry, clusterId, localAddress, user); + } + + @Override + ClientService.Interface getRegionServerStub(ServerName serverName) throws IOException { + throw new RegionLocationResultException(); + } + } } From 7da42da24b86310739727a424c911ee74306f635 Mon Sep 17 00:00:00 2001 From: huiruan Date: Sun, 17 Apr 2022 00:12:59 +0800 Subject: [PATCH 8/9] fix a re-complete future mistake --- .../hadoop/hbase/client/AsyncTableRegionLocatorImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 b9347caaabf1..14880eb948e3 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 @@ -72,10 +72,9 @@ public CompletableFuture> getAllRegionLocations() { try { locs.forEach(loc -> conn.getLocator() .getNonMetaRegionLocator().addLocationToCache(loc)); + future.complete(locs); } catch (Exception e) { future.completeExceptionally(e); - } finally { - future.complete(locs); } }); return future; From c5798cd00e91b4545ea606c0189ea13e06b03b4d Mon Sep 17 00:00:00 2001 From: huiruan Date: Mon, 18 Apr 2022 23:03:11 +0800 Subject: [PATCH 9/9] remove the extra future --- .../client/AsyncTableRegionLocatorImpl.java | 19 ++------ .../client/TestAsyncNonMetaRegionLocator.java | 48 ------------------- 2 files changed, 4 insertions(+), 63 deletions(-) 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 14880eb948e3..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 @@ -62,21 +62,10 @@ public CompletableFuture> getAllRegionLocations() { return conn.registry.getMetaRegionLocations() .thenApply(locs -> Arrays.asList(locs.getRegionLocations())); } - CompletableFuture> future = new CompletableFuture<>(); - addListener(ClientMetaTableAccessor.getTableHRegionLocations(conn - .getTable(TableName.META_TABLE_NAME), tableName), (locs, error) -> { - if (error != null) { - future.completeExceptionally(error); - return; - } - try { - locs.forEach(loc -> conn.getLocator() - .getNonMetaRegionLocator().addLocationToCache(loc)); - future.complete(locs); - } catch (Exception e) { - future.completeExceptionally(e); - } - }); + 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 85b77a75383b..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 @@ -26,12 +26,9 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; import java.io.IOException; -import java.net.SocketAddress; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -40,7 +37,6 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.IntStream; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseTestingUtil; import org.apache.hadoop.hbase.HRegionLocation; @@ -69,8 +65,6 @@ import org.apache.hbase.thirdparty.com.google.common.io.Closeables; -import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ClientService; - @Category({ MediumTests.class, ClientTests.class }) @RunWith(Parameterized.class) public class TestAsyncNonMetaRegionLocator { @@ -479,46 +473,4 @@ public void testCacheLocationWhenGetAllLocations() throws Exception { assertNotNull(conn.getLocator().getRegionLocationInCache(TABLE_NAME, region.getStartKey())); } } - - @Test - public void testCacheLocationExceptionallyWhenGetAllLocations() throws Exception { - createMultiRegionTable(); - Configuration config = new Configuration(TEST_UTIL.getConfiguration()); - config.setClass(ConnectionFactory.HBASE_CLIENT_ASYNC_CONNECTION_IMPL, - BadAsyncConnectionImpl.class, AsyncConnection.class); - AsyncConnectionImpl clientConn = (AsyncConnectionImpl) - ConnectionFactory.createAsyncConnection(config).get(); - - Exception ex = null; - try { - clientConn.getRegionLocator(TABLE_NAME).getAllRegionLocations().get(); - } catch (Exception e) { - ex = e; - } - - assertNotNull(ex); - assertTrue(ex instanceof ExecutionException); - assertTrue(ex.getCause() != null && ex.getCause() instanceof RegionLocationResultException); - - List regions = TEST_UTIL.getAdmin().getRegions(TABLE_NAME); - for (RegionInfo region : regions) { - assertNull(clientConn.getLocator() - .getRegionLocationInCache(TABLE_NAME, region.getStartKey())); - } - } - - private static final class RegionLocationResultException extends DoNotRetryIOException {} - - private static final class BadAsyncConnectionImpl extends AsyncConnectionImpl { - - public BadAsyncConnectionImpl(Configuration conf, ConnectionRegistry registry, - String clusterId, SocketAddress localAddress, User user) { - super(conf, registry, clusterId, localAddress, user); - } - - @Override - ClientService.Interface getRegionServerStub(ServerName serverName) throws IOException { - throw new RegionLocationResultException(); - } - } }