Index: src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java (revision 1227045) +++ src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java (working copy) @@ -29,6 +29,7 @@ import org.apache.hadoop.hbase.catalog.MetaEditor; import org.apache.hadoop.hbase.ipc.HMasterInterface; import org.apache.hadoop.hbase.master.AssignmentManager; +import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Threads; @@ -78,6 +79,31 @@ // Update table descriptor cache this.masterServices.getTableDescriptors().remove(Bytes.toString(tableName)); + // Before setting table to enabled, we should be sure that there is no + // region in toAssign queue. To ensure it, we could wait until master is + // initialized and no deadServer is in processing. + long stopTime = System.currentTimeMillis() + waitTime; + while (System.currentTimeMillis() < stopTime) { + if (!masterServices.getServerManager().areDeadServersInProgress() + && ((HMaster) server).isInitialized()) { + break; + } + Threads.sleep(1000); + LOG.debug("Waiting on processing of deadserver or initiallizing of master, deadServersInProgress = " + + masterServices.getServerManager().areDeadServersInProgress() + + ", master initiallized = " + ((HMaster) server).isInitialized()); + } + + if (masterServices.getServerManager().areDeadServersInProgress() + || ((HMaster) server).isInitialized()) { + throw new IOException( + "Waited hbase.master.wait.on.region (" + + waitTime + + "ms) for processing of deadserver or initiallizing of master, deadServersInProgress = " + + masterServices.getServerManager().areDeadServersInProgress() + + ", master initiallized = " + ((HMaster) server).isInitialized()); + } + // If entry for this table in zk, and up in AssignmentManager, remove it. // Call to undisableTable does this. TODO: Make a more formal purge table. am.getZKTable().setEnabledTable(Bytes.toString(tableName));