Repository: hbase Updated Branches: refs/heads/master df5de33a0 -> 45586ab30
HBASE-20220 [RSGroup] Check if table exists in the cluster before moving it to the specified regionserver group Signed-off-by: tedyu <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/45586ab3 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/45586ab3 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/45586ab3 Branch: refs/heads/master Commit: 45586ab3006885cea29ca5e0502b1ac00dc1b916 Parents: df5de33 Author: Guangxu Cheng <[email protected]> Authored: Tue Mar 20 00:56:41 2018 +0800 Committer: tedyu <[email protected]> Committed: Mon Mar 19 11:13:44 2018 -0700 ---------------------------------------------------------------------- .../hbase/rsgroup/RSGroupAdminClient.java | 12 ++++++- .../hadoop/hbase/rsgroup/TestRSGroupsBase.java | 34 +++++++++++++++++++- hbase-shell/src/main/ruby/shell/commands.rb | 2 ++ 3 files changed, 46 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/45586ab3/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java ---------------------------------------------------------------------- diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java index 380f323..eb9d915 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminClient.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.Set; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.TableNotFoundException; +import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; @@ -55,9 +57,11 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Sets; @InterfaceAudience.Private class RSGroupAdminClient implements RSGroupAdmin { private RSGroupAdminService.BlockingInterface stub; + private Admin admin; public RSGroupAdminClient(Connection conn) throws IOException { - stub = RSGroupAdminService.newBlockingStub(conn.getAdmin().coprocessorService()); + admin = conn.getAdmin(); + stub = RSGroupAdminService.newBlockingStub(admin.coprocessorService()); } @Override @@ -114,6 +118,9 @@ class RSGroupAdminClient implements RSGroupAdmin { MoveTablesRequest.Builder builder = MoveTablesRequest.newBuilder().setTargetGroup(targetGroup); for(TableName tableName: tables) { builder.addTableName(ProtobufUtil.toProtoTableName(tableName)); + if (!admin.tableExists(tableName)) { + throw new TableNotFoundException(tableName); + } } try { stub.moveTables(null, builder.build()); @@ -200,6 +207,9 @@ class RSGroupAdminClient implements RSGroupAdmin { } for(TableName tableName: tables) { builder.addTableName(ProtobufUtil.toProtoTableName(tableName)); + if (!admin.tableExists(tableName)) { + throw new TableNotFoundException(tableName); + } } try { stub.moveServersAndTables(null, builder.build()); http://git-wip-us.apache.org/repos/asf/hbase/blob/45586ab3/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java ---------------------------------------------------------------------- diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java index fef3a5e..9e29637 100644 --- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java +++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java @@ -45,6 +45,7 @@ import org.apache.hadoop.hbase.RegionMetrics; import org.apache.hadoop.hbase.ServerMetrics; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.TableNotFoundException; import org.apache.hadoop.hbase.Waiter; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.ClusterConnection; @@ -208,7 +209,7 @@ public abstract class TestRSGroupsBase { try { rsGroupAdmin.moveTables(Sets.newHashSet(TableName.valueOf("bogustable")), "bogus"); fail("Expected move with bogus group to fail"); - } catch(ConstraintException ex) { + } catch(ConstraintException|TableNotFoundException ex) { //expected } @@ -762,6 +763,37 @@ public abstract class TestRSGroupsBase { } @Test + public void testNonExistentTableMove() throws Exception { + TableName tableName = TableName.valueOf(tablePrefix + name.getMethodName()); + + RSGroupInfo tableGrp = rsGroupAdmin.getRSGroupInfoOfTable(tableName); + assertNull(tableGrp); + + //test if table exists already. + boolean exist = admin.tableExists(tableName); + assertFalse(exist); + + LOG.info("Moving table "+ tableName + " to " + RSGroupInfo.DEFAULT_GROUP); + try { + rsGroupAdmin.moveTables(Sets.newHashSet(tableName), RSGroupInfo.DEFAULT_GROUP); + fail("Table " + tableName + " shouldn't have been successfully moved."); + } catch(IOException ex) { + assertTrue(ex instanceof TableNotFoundException); + } + + try { + rsGroupAdmin.moveServersAndTables( + Sets.newHashSet(Address.fromParts("bogus",123)), + Sets.newHashSet(tableName), RSGroupInfo.DEFAULT_GROUP); + fail("Table " + tableName + " shouldn't have been successfully moved."); + } catch(IOException ex) { + assertTrue(ex instanceof TableNotFoundException); + } + //verify group change + assertNull(rsGroupAdmin.getRSGroupInfoOfTable(tableName)); + } + + @Test public void testMoveServersAndTables() throws Exception { LOG.info("testMoveServersAndTables"); final RSGroupInfo newGroup = addGroup(getGroupName(name.getMethodName()), 1); http://git-wip-us.apache.org/repos/asf/hbase/blob/45586ab3/hbase-shell/src/main/ruby/shell/commands.rb ---------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands.rb b/hbase-shell/src/main/ruby/shell/commands.rb index 990e978..d7730cf 100644 --- a/hbase-shell/src/main/ruby/shell/commands.rb +++ b/hbase-shell/src/main/ruby/shell/commands.rb @@ -112,6 +112,8 @@ module Shell handle_exceptions(cause, *args) if respond_to?(:handle_exceptions) # Global HBase exception handling below if not handled by respective command above if cause.is_a?(org.apache.hadoop.hbase.TableNotFoundException) + strs = cause.to_s.split(' ') + raise "Unknown table #{strs[0]}!" if strs.size == 1 raise "Unknown table #{args.first}!" end if cause.is_a?(org.apache.hadoop.hbase.UnknownRegionException)
