From dd65c49beab5c1f677a7e558938bb875996927ab Mon Sep 17 00:00:00 2001 From: tonypan123 Date: Tue, 15 Nov 2022 04:37:51 -0500 Subject: [PATCH 1/2] patch for hbase-26252 --- .../hbase/master/TableStateManager.java | 27 ++++++++++++++++++- .../procedure/CreateTableProcedure.java | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-) 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..d66c09e471e0 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,9 @@ public class TableStateManager { private final ConcurrentMap tableName2State = new ConcurrentHashMap<>(); + private final ConcurrentMap creating = + new ConcurrentHashMap<>(); + TableStateManager(MasterServices master) { this.master = master; } @@ -104,12 +107,34 @@ 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 + * @return void + */ + public void updateCreating(TableName tableName) { + creating.put(tableName,1); + } + + /** + * Notify that a table is created. + * @param tableName name of table created + * @return void + */ + 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..3d20dc5dc823 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: From faf5a271aad20d700ba6f76aba1b52e82040d3cb Mon Sep 17 00:00:00 2001 From: functioner Date: Wed, 7 Dec 2022 12:48:18 -0500 Subject: [PATCH 2/2] fix spotless --- .../org/apache/hadoop/hbase/master/TableStateManager.java | 7 ++----- .../hbase/master/procedure/CreateTableProcedure.java | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) 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 d66c09e471e0..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,8 +55,7 @@ public class TableStateManager { private final ConcurrentMap tableName2State = new ConcurrentHashMap<>(); - private final ConcurrentMap creating = - new ConcurrentHashMap<>(); + private final ConcurrentMap creating = new ConcurrentHashMap<>(); TableStateManager(MasterServices master) { this.master = master; @@ -116,16 +115,14 @@ public boolean isTablePresent(TableName tableName) throws IOException { /** * Set a table as being created. * @param tableName name of table being created - * @return void */ public void updateCreating(TableName tableName) { - creating.put(tableName,1); + creating.put(tableName, 1); } /** * Notify that a table is created. * @param tableName name of table created - * @return void */ public void finishCreating(TableName tableName) { creating.remove(tableName); 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 3d20dc5dc823..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,7 +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()); + env.getMasterServices().getTableStateManager().updateCreating(getTableName()); setEnablingState(env, getTableName()); addChildProcedure( env.getAssignmentManager().createRoundRobinAssignProcedures(newRegions));