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)

Reply via email to