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];

Reply via email to