HBASE-20666 Unsuccessful table creation leaves entry in hbase:rsgroup table

Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
Xu Cang 2018-08-20 01:14:27 -07:00 committed by tedyu
parent d1b5113511
commit b5ae4e5f9e
2 changed files with 70 additions and 1 deletions

View File

@ -18,11 +18,13 @@
package org.apache.hadoop.hbase.rsgroup; package org.apache.hadoop.hbase.rsgroup;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import java.io.IOException; import java.io.IOException;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -45,6 +47,7 @@ import org.apache.hadoop.hbase.coprocessor.MasterObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.master.MasterCoprocessorHost; import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
import org.apache.hadoop.hbase.master.ServerManager; import org.apache.hadoop.hbase.master.ServerManager;
import org.apache.hadoop.hbase.master.TableNamespaceManager;
import org.apache.hadoop.hbase.master.snapshot.SnapshotManager; import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.quotas.QuotaTableUtil; import org.apache.hadoop.hbase.quotas.QuotaTableUtil;
@ -94,7 +97,6 @@ public class TestRSGroups extends TestRSGroupsBase {
ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART,
NUM_SLAVES_BASE - 1); NUM_SLAVES_BASE - 1);
TEST_UTIL.getConfiguration().setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true); TEST_UTIL.getConfiguration().setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);
initialize(); initialize();
} }
@ -456,6 +458,67 @@ public class TestRSGroups extends TestRSGroupsBase {
} }
} }
@Test
public void testRSGroupListDoesNotContainFailedTableCreation() throws Exception {
toggleQuotaCheckAndRestartMiniCluster(true);
String nsp = "np1";
NamespaceDescriptor nspDesc =
NamespaceDescriptor.create(nsp).addConfiguration(TableNamespaceManager.KEY_MAX_REGIONS, "5")
.addConfiguration(TableNamespaceManager.KEY_MAX_TABLES, "2").build();
admin.createNamespace(nspDesc);
assertEquals(3, admin.listNamespaceDescriptors().length);
HColumnDescriptor fam1 = new HColumnDescriptor("fam1");
HTableDescriptor tableDescOne =
new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table1"));
tableDescOne.addFamily(fam1);
admin.createTable(tableDescOne);
HTableDescriptor tableDescTwo =
new HTableDescriptor(TableName.valueOf(nsp + TableName.NAMESPACE_DELIM + "table2"));
tableDescTwo.addFamily(fam1);
boolean constraintViolated = false;
try {
admin.createTable(tableDescTwo, Bytes.toBytes("AAA"), Bytes.toBytes("ZZZ"),
6);
Assert.fail("Creation table should fail because of quota violation.");
} catch (Exception exp) {
assertTrue(exp instanceof IOException);
constraintViolated = true;
} finally {
assertTrue("Constraint not violated for table " + tableDescTwo.getTableName(),
constraintViolated);
}
List<RSGroupInfo> rsGroupInfoList = rsGroupAdmin.listRSGroups();
boolean foundTable2 = false;
boolean foundTable1 = false;
for(int i = 0; i < rsGroupInfoList.size(); i++){
if(rsGroupInfoList.get(i).getTables().contains(tableDescTwo.getTableName())){
foundTable2 = true;
}
if(rsGroupInfoList.get(i).getTables().contains(tableDescOne.getTableName())){
foundTable1 = true;
}
}
assertFalse("Found table2 in rsgroup list.", foundTable2);
assertTrue("Did not find table1 in rsgroup list", foundTable1);
TEST_UTIL.deleteTable(tableDescOne.getTableName());
admin.deleteNamespace(nspDesc.getName());
toggleQuotaCheckAndRestartMiniCluster(false);
}
private void toggleQuotaCheckAndRestartMiniCluster(boolean enable) throws Exception{
TEST_UTIL.shutdownMiniCluster();
TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, enable);
TEST_UTIL.startMiniCluster(NUM_SLAVES_BASE - 1);
TEST_UTIL.getConfiguration().setInt(
ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART,
NUM_SLAVES_BASE - 1);
TEST_UTIL.getConfiguration().setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);
initialize();
}
private void restartHBaseCluster() throws Exception { private void restartHBaseCluster() throws Exception {
LOG.info("\n\nShutting down cluster"); LOG.info("\n\nShutting down cluster");
TEST_UTIL.shutdownMiniHBaseCluster(); TEST_UTIL.shutdownMiniHBaseCluster();

View File

@ -140,6 +140,12 @@ public class CreateTableProcedure
// We can fail if the table does exist or the descriptor is malformed. // We can fail if the table does exist or the descriptor is malformed.
// TODO: coprocessor rollback semantic is still undefined. // TODO: coprocessor rollback semantic is still undefined.
DeleteTableProcedure.deleteTableStates(env, getTableName()); DeleteTableProcedure.deleteTableStates(env, getTableName());
final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();
if (cpHost != null) {
cpHost.postDeleteTable(getTableName());
}
releaseSyncLatch(); releaseSyncLatch();
return; return;
} }