From 7dd0c6c498d8a508d8f0725f2c64947d254fdd10 Mon Sep 17 00:00:00 2001 From: Sakthi Date: Sun, 24 Mar 2019 00:43:12 -0700 Subject: [PATCH] HBASE-22094: Throw TableNotFoundException if table not exists in AsyncAdmin.compact --- .../hadoop/hbase/client/AsyncAdmin.java | 12 ++++++ .../hbase/client/RawAsyncHBaseAdmin.java | 38 ++++++++++++------- .../hbase/client/TestAsyncRegionAdminApi.java | 21 ++++++++++ 3 files changed, 57 insertions(+), 14 deletions(-) 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-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java index 587c6e213507f4df75d60fd00688cc65a3873741..28ad43730d3cb44f098707ae51a5655675c09d3f 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java @@ -1098,24 +1098,34 @@ class RawAsyncHBaseAdmin implements AsyncAdmin { }); break; case NORMAL: - addListener(getTableHRegionLocations(tableName), (locations, err) -> { + addListener(tableExists(tableName), (exists, err) -> { if (err != null) { future.completeExceptionally(err); return; + } else if (!exists) { + future.completeExceptionally(new TableNotFoundException(tableName)); + } else { + addListener(getTableHRegionLocations(tableName), (locations, err2) -> { + if (err2 != null) { + future.completeExceptionally(err2); + return; + } + CompletableFuture[] compactFutures = + locations.stream().filter(l -> l.getRegion() != null) + .filter(l -> !l.getRegion().isOffline()) + .filter(l -> l.getServerName() != null) + .map(l -> compact(l.getServerName(), l.getRegion(), major, columnFamily)) + .toArray(CompletableFuture[]::new); + // future complete unless all of the compact futures are completed. + addListener(CompletableFuture.allOf(compactFutures), (ret, err3) -> { + if (err3 != null) { + future.completeExceptionally(err3); + } else { + future.complete(ret); + } + }); + }); } - CompletableFuture[] compactFutures = - locations.stream().filter(l -> l.getRegion() != null) - .filter(l -> !l.getRegion().isOffline()).filter(l -> l.getServerName() != null) - .map(l -> compact(l.getServerName(), l.getRegion(), major, columnFamily)) - .toArray(CompletableFuture[]::new); - // future complete unless all of the compact futures are completed. - addListener(CompletableFuture.allOf(compactFutures), (ret, err2) -> { - if (err2 != null) { - future.completeExceptionally(err2); - } else { - future.complete(ret); - } - }); }); break; default: 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)