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());
+ }
}