This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch rc/2.0.5 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit dc407350a8e9027382574d45e5aecc7e74b7e320 Author: Caideyipi <[email protected]> AuthorDate: Tue Jul 22 18:31:50 2025 +0800 Pipe: Fixed the renaming view's concurrency problem (cherry picked from commit 4f9e75f944f0d3ac3250be3e3076cadcfd23d087) --- .../iotdb/confignode/manager/ConfigManager.java | 2 +- .../iotdb/confignode/manager/ProcedureManager.java | 60 +++++++++++++++------- .../receiver/protocol/IoTDBConfigNodeReceiver.java | 1 + .../impl/schema/table/RenameTableProcedure.java | 4 ++ 4 files changed, 48 insertions(+), 19 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java index 6ad2d87fe6f..b76ad38c2ba 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java @@ -2909,7 +2909,7 @@ public class ConfigManager implements IManager { table -> procedureManager .checkDuplicateTableTask( - entry.getKey(), null, table, null, null) + entry.getKey(), null, table, null, null, null) .getRight()); return true; }) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java index bac74158cd6..9a5feb0b407 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java @@ -268,7 +268,7 @@ public class ProcedureManager { && System.currentTimeMillis() - startCheckTimeForProcedures < PROCEDURE_WAIT_TIME_OUT) { final Pair<Long, Boolean> procedureIdDuplicatePair = checkDuplicateTableTask( - database, null, null, null, ProcedureType.DELETE_DATABASE_PROCEDURE); + database, null, null, null, null, ProcedureType.DELETE_DATABASE_PROCEDURE); hasOverlappedTask = procedureIdDuplicatePair.getRight(); if (Boolean.FALSE.equals(procedureIdDuplicatePair.getRight())) { @@ -1960,25 +1960,17 @@ public class ProcedureManager { public TSStatus renameTable(final TAlterOrDropTableReq req) { final boolean isView = req.isSetIsView() && req.isIsView(); + final String newName = ReadWriteIOUtils.readString(req.updateInfo); return executeWithoutDuplicate( req.database, null, req.tableName, + newName, req.queryId, isView ? ProcedureType.RENAME_VIEW_PROCEDURE : ProcedureType.RENAME_TABLE_PROCEDURE, isView - ? new RenameViewProcedure( - req.database, - req.tableName, - req.queryId, - ReadWriteIOUtils.readString(req.updateInfo), - false) - : new RenameTableProcedure( - req.database, - req.tableName, - req.queryId, - ReadWriteIOUtils.readString(req.updateInfo), - false)); + ? new RenameViewProcedure(req.database, req.tableName, req.queryId, newName, false) + : new RenameTableProcedure(req.database, req.tableName, req.queryId, newName, false)); } public TDeleteTableDeviceResp deleteDevices( @@ -1992,6 +1984,7 @@ public class ProcedureManager { req.database, null, req.tableName, + null, req.queryId, ProcedureType.DELETE_DEVICES_PROCEDURE); procedureId = procedureIdDuplicatePair.getLeft(); @@ -2036,10 +2029,21 @@ public class ProcedureManager { final String queryId, final ProcedureType thisType, final Procedure<ConfigNodeProcedureEnv> procedure) { + return executeWithoutDuplicate(database, table, tableName, null, queryId, thisType, procedure); + } + + public TSStatus executeWithoutDuplicate( + final String database, + final TsTable table, + final String tableName, + final @Nullable String newName, + final String queryId, + final ProcedureType thisType, + final Procedure<ConfigNodeProcedureEnv> procedure) { final long procedureId; synchronized (this) { final Pair<Long, Boolean> procedureIdDuplicatePair = - checkDuplicateTableTask(database, table, tableName, queryId, thisType); + checkDuplicateTableTask(database, table, tableName, newName, queryId, thisType); procedureId = procedureIdDuplicatePair.getLeft(); if (procedureId == -1) { @@ -2060,6 +2064,7 @@ public class ProcedureManager { final @Nonnull String database, final TsTable table, final String tableName, + final String newName, final String queryId, final ProcedureType thisType) { ProcedureType type; @@ -2080,7 +2085,9 @@ public class ProcedureManager { // tableName == null indicates delete database procedure if (database.equals(createTableProcedure.getDatabase()) && (Objects.isNull(tableName) - || Objects.equals(tableName, createTableProcedure.getTable().getTableName()))) { + || Objects.equals(tableName, createTableProcedure.getTable().getTableName()) + || Objects.nonNull(newName) + && Objects.equals(newName, createTableProcedure.getTable().getTableName()))) { return new Pair<>(-1L, true); } break; @@ -2095,8 +2102,6 @@ public class ProcedureManager { case DROP_TABLE_PROCEDURE: case DROP_VIEW_PROCEDURE: case DELETE_DEVICES_PROCEDURE: - case RENAME_TABLE_PROCEDURE: - case RENAME_VIEW_PROCEDURE: final AbstractAlterOrDropTableProcedure<?> alterTableProcedure = (AbstractAlterOrDropTableProcedure<?>) procedure; if (type == thisType && queryId.equals(alterTableProcedure.getQueryId())) { @@ -2105,7 +2110,26 @@ public class ProcedureManager { // tableName == null indicates delete database procedure if (database.equals(alterTableProcedure.getDatabase()) && (Objects.isNull(tableName) - || Objects.equals(tableName, alterTableProcedure.getTableName()))) { + || Objects.equals(tableName, alterTableProcedure.getTableName()) + || Objects.nonNull(newName) + && Objects.equals(newName, alterTableProcedure.getTableName()))) { + return new Pair<>(-1L, true); + } + break; + case RENAME_TABLE_PROCEDURE: + case RENAME_VIEW_PROCEDURE: + final RenameTableProcedure renameTableProcedure = (RenameTableProcedure) procedure; + if (type == thisType && queryId.equals(renameTableProcedure.getQueryId())) { + return new Pair<>(procedure.getProcId(), false); + } + // tableName == null indicates delete database procedure + if (database.equals(renameTableProcedure.getDatabase()) + && (Objects.isNull(tableName) + || Objects.equals(tableName, renameTableProcedure.getTableName()) + || Objects.equals(tableName, renameTableProcedure.getNewName()) + || Objects.nonNull(newName) + && (Objects.equals(newName, renameTableProcedure.getTableName()) + || Objects.equals(newName, renameTableProcedure.getNewName())))) { return new Pair<>(-1L, true); } break; diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java index 6c177abbf86..6ed7abb2b65 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java @@ -846,6 +846,7 @@ public class IoTDBConfigNodeReceiver extends IoTDBFileReceiver { ((RenameTablePlan) plan).getDatabase(), null, ((RenameTablePlan) plan).getTableName(), + ((RenameTablePlan) plan).getNewName(), queryId, ProcedureType.RENAME_TABLE_PROCEDURE, new RenameTableProcedure( diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java index a0a5e109534..1e5dc24781c 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java @@ -179,6 +179,10 @@ public class RenameTableProcedure extends AbstractAlterOrDropTableProcedure<Rena } } + public String getNewName() { + return newName; + } + @Override protected RenameTableState getState(final int stateId) { return RenameTableState.values()[stateId];
