HBASE-20666 Unsuccessful table creation leaves entry in hbase:rsgroup table
Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
parent
f62c8201b6
commit
50055dbf04
|
@ -18,11 +18,13 @@
|
|||
package org.apache.hadoop.hbase.rsgroup;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
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.master.MasterCoprocessorHost;
|
||||
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.net.Address;
|
||||
import org.apache.hadoop.hbase.quotas.QuotaTableUtil;
|
||||
|
@ -94,7 +97,6 @@ public class TestRSGroups extends TestRSGroupsBase {
|
|||
ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART,
|
||||
NUM_SLAVES_BASE - 1);
|
||||
TEST_UTIL.getConfiguration().setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);
|
||||
|
||||
initialize();
|
||||
}
|
||||
|
||||
|
@ -542,6 +544,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 {
|
||||
LOG.info("\n\nShutting down cluster");
|
||||
TEST_UTIL.shutdownMiniHBaseCluster();
|
||||
|
|
|
@ -140,6 +140,12 @@ public class CreateTableProcedure
|
|||
// 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());
|
||||
}
|
||||
|
||||
releaseSyncLatch();
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue