diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java index 6ad32623be1a..dffdb14932e7 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java @@ -55,6 +55,8 @@ public class TableStateManager { private final ConcurrentMap tableName2State = new ConcurrentHashMap<>(); + private final ConcurrentMap creating = new ConcurrentHashMap<>(); + TableStateManager(MasterServices master) { this.master = master; } @@ -104,12 +106,32 @@ public boolean isTablePresent(TableName tableName) throws IOException { ReadWriteLock lock = tnLock.getLock(tableName); lock.readLock().lock(); try { - return readMetaState(tableName) != null; + return readMetaState(tableName) != null && !isCreating(tableName); } finally { lock.readLock().unlock(); } } + /** + * Set a table as being created. + * @param tableName name of table being created + */ + public void updateCreating(TableName tableName) { + creating.put(tableName, 1); + } + + /** + * Notify that a table is created. + * @param tableName name of table created + */ + public void finishCreating(TableName tableName) { + creating.remove(tableName); + } + + private boolean isCreating(TableName tableName) { + return creating.containsKey(tableName); + } + /** * Return all tables in given states. * @param states filter by states 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 34e1f3d5bfc3..42d6fe4f4c3f 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 @@ -105,6 +105,7 @@ protected Flow executeFromState(final MasterProcedureEnv env, final CreateTableS setNextState(CreateTableState.CREATE_TABLE_ASSIGN_REGIONS); break; case CREATE_TABLE_ASSIGN_REGIONS: + env.getMasterServices().getTableStateManager().updateCreating(getTableName()); setEnablingState(env, getTableName()); addChildProcedure( env.getAssignmentManager().createRoundRobinAssignProcedures(newRegions)); @@ -114,6 +115,7 @@ protected Flow executeFromState(final MasterProcedureEnv env, final CreateTableS // XXX: this stage should be named as set table enabled, as now we will cache the // descriptor after writing fs layout. setEnabledState(env, getTableName()); + env.getMasterServices().getTableStateManager().finishCreating(getTableName()); setNextState(CreateTableState.CREATE_TABLE_POST_OPERATION); break; case CREATE_TABLE_POST_OPERATION: