From af80badfa577aa3a66e8d8df2da1eb770795da65 Mon Sep 17 00:00:00 2001 From: 761417898 <761417898@qq.com> Date: Fri, 9 Oct 2026 10:53:35 +0800 Subject: [PATCH] Fix duplicate DataRegion scheduling after recovery (cherry picked from commit 0ee81914c41abc9abd6c19d7323dc2819997731d) --- .../apache/iotdb/db/storageengine/StorageEngine.java | 2 +- .../schedule/CompactionScheduleTaskManager.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java index b3179e8556edb..fb402cb8000c4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java @@ -368,7 +368,7 @@ private void asyncRecoverTsFileResource() { if (dataRegion != null) { List> asyncTsFileResourceRecoverTasks = dataRegion.getAsyncTsFileResourceRecoverTaskList(); - if (asyncTsFileResourceRecoverTasks != null) { + if (asyncTsFileResourceRecoverTasks != null && !asyncTsFileResourceRecoverTasks.isEmpty()) { Callable taskOfRegion = () -> { for (Callable task : asyncTsFileResourceRecoverTasks) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleTaskManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleTaskManager.java index 516b1489a206d..96c7b42621679 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleTaskManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleTaskManager.java @@ -242,11 +242,17 @@ public static RepairDataTaskManager getRepairTaskManagerInstance() { } public void registerDataRegion(DataRegion dataRegion) { - dataRegionList.add(dataRegion); + synchronized (dataRegionList) { + if (!dataRegionList.contains(dataRegion)) { + dataRegionList.add(dataRegion); + } + } } public void unregisterDataRegion(DataRegion dataRegion) { - dataRegionList.remove(dataRegion); + synchronized (dataRegionList) { + dataRegionList.removeIf(region -> region == dataRegion); + } } public class RepairDataTaskManager {