This is an automated email from the ASF dual-hosted git repository. JackieTien97 pushed a commit to branch rc/2.0.11 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit ab31e1b509a9b114256ce2d5906ba5f0c9fa4ec6 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 357c14eca4a..0a08a46ba22 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 @@ -1439,8 +1439,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()); + } }
