This is an automated email from the ASF dual-hosted git repository.

JackieTien97 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 346abc37df2 Fix DataNode restart during database deletion (#18407)
346abc37df2 is described below

commit 346abc37df2e27dae6986fa26e5a46085afe9a5a
Author: Caideyipi <[email protected]>
AuthorDate: Wed Aug 5 18:53:17 2026 +0800

    Fix DataNode restart during database deletion (#18407)
---
 .../manager/schema/ClusterSchemaManager.java       |  7 ++--
 .../manager/ClusterSchemaManagerTest.java          | 37 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 2 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
index a0284445ea2..c28034cb9a7 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
@@ -1448,8 +1448,11 @@ public class ClusterSchemaManager {
       // 1. if the alteringTableList is null, means that executing the drop 
database is going on
       if (Objects.isNull(alteringTableList)) {
         List<TsTable> relatedTables = usingTableMap.remove(databaseName);
-        relatedTables.forEach(
-            table -> speicalMapList.add(new 
NonCommittableTsTable(table.getTableName())));
+        // The database schema may already be removed while its deletion 
procedure is still running.
+        if (Objects.nonNull(relatedTables)) {
+          relatedTables.forEach(
+              table -> speicalMapList.add(new 
NonCommittableTsTable(table.getTableName())));
+        }
       } else {
         // 2. if the table has existed, the procedure is modifying it.
         // so the usingTableMap and specialStatusMap both hold it
diff --git 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/manager/ClusterSchemaManagerTest.java
 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/manager/ClusterSchemaManagerTest.java
index 261f60ed65a..baa49ff2d31 100644
--- 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/manager/ClusterSchemaManagerTest.java
+++ 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/manager/ClusterSchemaManagerTest.java
@@ -18,10 +18,21 @@
  */
 package org.apache.iotdb.confignode.manager;
 
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.TsTableInternalRPCUtil;
 import org.apache.iotdb.confignode.manager.schema.ClusterSchemaManager;
+import org.apache.iotdb.confignode.manager.schema.ClusterSchemaQuotaStatistics;
+import org.apache.iotdb.confignode.persistence.schema.ClusterSchemaInfo;
 
+import org.apache.tsfile.utils.Pair;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class ClusterSchemaManagerTest {
 
@@ -37,4 +48,30 @@ public class ClusterSchemaManagerTest {
     // (resourceWeight * resource) / (createdStorageGroupNum * 
replicationFactor)
     Assert.assertEquals(20, ClusterSchemaManager.calcMaxRegionGroupNum(3, 1.0, 
120, 2, 3, 5));
   }
+
+  @Test
+  public void testGetAllTableInfoForDataNodeActivationWithDeletedDatabase() {
+    final IManager configManager = Mockito.mock(IManager.class);
+    final ProcedureManager procedureManager = 
Mockito.mock(ProcedureManager.class);
+    final ClusterSchemaInfo clusterSchemaInfo = 
Mockito.mock(ClusterSchemaInfo.class);
+
+    
Mockito.when(configManager.getProcedureManager()).thenReturn(procedureManager);
+    Mockito.when(procedureManager.getAllExecutingTables())
+        .thenReturn(Collections.singletonMap("test", null));
+    Mockito.when(clusterSchemaInfo.getAllUsingTables()).thenReturn(new 
HashMap<>());
+    Mockito.when(clusterSchemaInfo.getAllPreDeleteTables()).thenReturn(new 
HashMap<>());
+    Mockito.when(clusterSchemaInfo.getAllPreCreateTables()).thenReturn(new 
HashMap<>());
+
+    final ClusterSchemaManager clusterSchemaManager =
+        new ClusterSchemaManager(
+            configManager, clusterSchemaInfo, 
Mockito.mock(ClusterSchemaQuotaStatistics.class));
+
+    final Pair<Map<String, List<TsTable>>, Map<String, List<TsTable>>> 
tableInfo =
+        TsTableInternalRPCUtil.deserializeTableInitializationInfo(
+            clusterSchemaManager.getAllTableInfoForDataNodeActivation());
+
+    Assert.assertTrue(tableInfo.left.isEmpty());
+    Assert.assertEquals(Collections.singleton("test"), 
tableInfo.right.keySet());
+    Assert.assertTrue(tableInfo.right.get("test").isEmpty());
+  }
 }

Reply via email to