From e86f299e5bf79371e96a0b45c66e00fa1e4d5951 Mon Sep 17 00:00:00 2001 From: Sakthi Date: Sat, 23 Mar 2019 21:06:00 -0700 Subject: [PATCH] HBASE-22094: Throw TableNotFoundException if table not exists in AsyncAdmin.compact --- .../hadoop/hbase/AsyncMetaTableAccessor.java | 2 +- .../hadoop/hbase/client/AsyncAdmin.java | 12 +++++++++++ .../hbase/client/TestAsyncRegionAdminApi.java | 21 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/AsyncMetaTableAccessor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/AsyncMetaTableAccessor.java index 4a886d13e97e54f05beaa96c08cb8acb81fb8901..0ed6713612e5c855d6a0e39d7540c2e9297c0e2e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/AsyncMetaTableAccessor.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/AsyncMetaTableAccessor.java @@ -189,7 +189,7 @@ public class AsyncMetaTableAccessor { if (err != null) { future.completeExceptionally(err); } else if (locations == null || locations.isEmpty()) { - future.complete(Collections.emptyList()); + future.completeExceptionally(new TableNotFoundException(tableName.get())); } else { List regionLocations = locations.stream().map(loc -> new HRegionLocation(loc.getFirst(), loc.getSecond())) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java index f7adc165102147bd87333dbc28e0ed1518915d46..70630c5bb20cf667d55ec00c934f17597b679683 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java @@ -317,6 +317,7 @@ public interface AsyncAdmin { /** * Compact a table. When the returned CompletableFuture is done, it only means the compact request * was sent to HBase and may need some time to finish the compact operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found. * @param tableName table to compact */ default CompletableFuture compact(TableName tableName) { @@ -327,6 +328,7 @@ public interface AsyncAdmin { * Compact a column family within a table. When the returned CompletableFuture is done, it only * means the compact request was sent to HBase and may need some time to finish the compact * operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found. * @param tableName table to compact * @param columnFamily column family within a table. If not present, compact the table's all * column families. @@ -338,6 +340,8 @@ public interface AsyncAdmin { /** * Compact a table. When the returned CompletableFuture is done, it only means the compact request * was sent to HBase and may need some time to finish the compact operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found for + * normal compaction type. * @param tableName table to compact * @param compactType {@link org.apache.hadoop.hbase.client.CompactType} */ @@ -347,6 +351,8 @@ public interface AsyncAdmin { * Compact a column family within a table. When the returned CompletableFuture is done, it only * means the compact request was sent to HBase and may need some time to finish the compact * operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found for + * normal compaction type. * @param tableName table to compact * @param columnFamily column family within a table * @param compactType {@link org.apache.hadoop.hbase.client.CompactType} @@ -374,6 +380,7 @@ public interface AsyncAdmin { /** * Major compact a table. When the returned CompletableFuture is done, it only means the compact * request was sent to HBase and may need some time to finish the compact operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found. * @param tableName table to major compact */ default CompletableFuture majorCompact(TableName tableName) { @@ -384,6 +391,7 @@ public interface AsyncAdmin { * Major compact a column family within a table. When the returned CompletableFuture is done, it * only means the compact request was sent to HBase and may need some time to finish the compact * operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found. * @param tableName table to major compact * @param columnFamily column family within a table. If not present, major compact the table's all * column families. @@ -395,6 +403,8 @@ public interface AsyncAdmin { /** * Major compact a table. When the returned CompletableFuture is done, it only means the compact * request was sent to HBase and may need some time to finish the compact operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found for + * normal compaction type. * @param tableName table to major compact * @param compactType {@link org.apache.hadoop.hbase.client.CompactType} */ @@ -404,6 +414,8 @@ public interface AsyncAdmin { * Major compact a column family within a table. When the returned CompletableFuture is done, it * only means the compact request was sent to HBase and may need some time to finish the compact * operation. + * Throws {@link org.apache.hadoop.hbase.TableNotFoundException} if table not found for + * normal compaction. type. * @param tableName table to major compact * @param columnFamily column family within a table. If not present, major compact the table's all * column families. diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java index 6d30faf6248e80434089c5c8933cb50d98340022..3a8673cfba3dfc066d583236dcad0ce670f4015e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java @@ -36,6 +36,7 @@ import java.util.stream.Collectors; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.TableNotFoundException; import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.RegionState; import org.apache.hadoop.hbase.master.ServerManager; @@ -427,6 +428,26 @@ public class TestAsyncRegionAdminApi extends TestAsyncAdminBase { } } + @Test + public void testNonExistentTableCompaction() { + testNonExistentTableCompaction(CompactionState.MINOR); + testNonExistentTableCompaction(CompactionState.MAJOR); + } + + private void testNonExistentTableCompaction(CompactionState compactionState) { + try { + if (compactionState == CompactionState.MINOR) { + admin.compact(TableName.valueOf("NonExistentTable")).get(); + } else { + admin.majorCompact(TableName.valueOf("NonExistentTable")).get(); + } + fail("Expected TableNotFoundException when table doesn't exist"); + } catch (Exception e) { + // expected. + assertTrue(e.getCause() instanceof TableNotFoundException); + } + } + private static int countStoreFilesInFamily(List regions, final byte[] family) { return countStoreFilesInFamilies(regions, new byte[][] { family }); } -- 2.17.2 (Apple Git-113)