HBASE-20666 Unsuccessful table creation leaves entry in hbase:rsgroup table
Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
parent
d1b5113511
commit
b5ae4e5f9e
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue