From 17736e0a8797878767e5a80e9182383a5ee2402e Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Tue, 19 Feb 2019 07:31:10 +0000 Subject: [PATCH] HBASE-21866 Do not move the table to null rsgroup when creating an existing table --- .../hbase/rsgroup/TestRSGroupsAdmin1.java | 36 +++++++++++++++++++ .../procedure/CreateTableProcedure.java | 11 +++--- 2 files changed, 43 insertions(+), 4 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 4d41d36962e..ca53985dc81 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,9 +28,12 @@ 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.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; @@ -452,6 +455,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() { + @Override + public boolean evaluate() throws Exception { + return + (master.getMasterProcedureExecutor().getActiveExecutorCount() == 0); + } + }); + SortedSet 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 3e144d026d0..34fde27d03c 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()); + if (hasException() /* avoid NPE */ && + getException().getCause().getClass() != TableExistsException.class) { + DeleteTableProcedure.deleteTableStates(env, getTableName()); - final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); - if (cpHost != null) { - cpHost.postDeleteTable(getTableName()); + final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost(); + if (cpHost != null) { + cpHost.postDeleteTable(getTableName()); + } } releaseSyncLatch();