From 850b688556cae63e0637956c6d3c5edc185a52d7 Mon Sep 17 00:00:00 2001 From: Guangxu Cheng Date: Tue, 20 Mar 2018 00:56:41 +0800 Subject: [PATCH] HBASE-20220 [RSGroup] Check if table exists in the cluster before moving it to the specified regionserver group --- .../hadoop/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(-) 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 380f323bdf..eb9d915564 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()); 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 fef3a5ebe1..9e296370f6 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); diff --git a/hbase-shell/src/main/ruby/shell/commands.rb b/hbase-shell/src/main/ruby/shell/commands.rb index 990e978dde..d7730cf891 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) -- 2.13.0.windows.1