You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by xu...@apache.org on 2019/02/18 18:54:45 UTC

[hbase] branch master updated: HBASE-21866 Do not move the table to null rsgroup when creating an existing table

This is an automated email from the ASF dual-hosted git repository.

xucang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 7ecb45a  HBASE-21866 Do not move the table to null rsgroup when creating an existing table
7ecb45a is described below

commit 7ecb45a4b0b15bf01c505a9e416eb9aa51d322af
Author: Xiang Li <li...@freewheel.tv>
AuthorDate: Thu Feb 14 08:23:53 2019 +0000

    HBASE-21866 Do not move the table to null rsgroup when creating an existing table
---
 .../hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java   | 36 ++++++++++++++++++++++
 .../master/procedure/CreateTableProcedure.java     | 13 +++++---
 2 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java
index 0452ac5..27511e3 100644
--- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java
+++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java
@@ -28,10 +28,13 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedSet;
+
 import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.MiniHBaseCluster;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableExistsException;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.TableNotFoundException;
 import org.apache.hadoop.hbase.Waiter;
@@ -482,6 +485,39 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase {
 
   }
 
+  @Test
+  public void testNotMoveTableToNullRSGroupWhenCreatingExistingTable()
+      throws Exception {
+    // Trigger
+    TableName tn1 = TableName.valueOf("t1");
+    TEST_UTIL.createTable(tn1, "cf1");
+    try {
+      // Create an existing table to trigger HBASE-21866
+      TEST_UTIL.createTable(tn1, "cf1");
+    } catch (TableExistsException teex) {
+      // Ignore
+    }
+
+    // Wait then verify
+    //   Could not verify until the rollback of CreateTableProcedure is done
+    //   (that is, the coprocessor finishes its work),
+    //   or the table is still in the "default" rsgroup even though HBASE-21866
+    //   is not fixed.
+    TEST_UTIL.waitFor(5000, new Waiter.Predicate<Exception>() {
+      @Override
+      public boolean evaluate() throws Exception {
+        return
+            (master.getMasterProcedureExecutor().getActiveExecutorCount() == 0);
+      }
+    });
+    SortedSet<TableName> tables
+        = rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP).getTables();
+    assertTrue("Table 't1' must be in 'default' rsgroup", tables.contains(tn1));
+
+    // Cleanup
+    TEST_UTIL.deleteTable(tn1);
+  }
+
   private void toggleQuotaCheckAndRestartMiniCluster(boolean enable) throws Exception {
     TEST_UTIL.shutdownMiniCluster();
     TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, enable);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
index 3e144d0..34fde27 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
@@ -139,11 +139,14 @@ public class CreateTableProcedure
       // nothing to rollback, pre-create is just table-state checks.
       // We can fail if the table does exist or the descriptor is malformed.
       // TODO: coprocessor rollback semantic is still undefined.
-      DeleteTableProcedure.deleteTableStates(env, getTableName());
-
-      final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();
-      if (cpHost != null) {
-        cpHost.postDeleteTable(getTableName());
+      if (hasException() /* avoid NPE */ &&
+          getException().getCause().getClass() != TableExistsException.class) {
+        DeleteTableProcedure.deleteTableStates(env, getTableName());
+
+        final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();
+        if (cpHost != null) {
+          cpHost.postDeleteTable(getTableName());
+        }
       }
 
       releaseSyncLatch();