This is an automated email from the ASF dual-hosted git repository.
shuwenwei 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 6c3c6173756 Fixed the concurrency bug for delete-table and compaction
that may cause skipped deletion (#17736)
6c3c6173756 is described below
commit 6c3c61737568f375d4d35153baff40c80045daba
Author: Caideyipi <[email protected]>
AuthorDate: Fri May 22 09:49:30 2026 +0800
Fixed the concurrency bug for delete-table and compaction that may cause
skipped deletion (#17736)
---
.../db/storageengine/dataregion/DataRegion.java | 6 ++-
.../storageengine/dataregion/DataRegionTest.java | 46 ++++++++++++++++++++++
2 files changed, 51 insertions(+), 1 deletion(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index 561cf106156..784d4fa4771 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -3479,7 +3479,11 @@ public class DataRegion implements IDataRegionForQuery {
}
}
if (matchSize == devicesInFile.size()) {
- deletedByFiles.add(sealedTsFile);
+ if (sealedTsFile.setStatus(TsFileResourceStatus.DELETED)) {
+ deletedByFiles.add(sealedTsFile);
+ } else {
+ deletedByMods.add(sealedTsFile);
+ }
}
if (logger.isDebugEnabled()) {
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/DataRegionTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/DataRegionTest.java
index 19ac712882b..3aced7e9fe1 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/DataRegionTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/DataRegionTest.java
@@ -47,6 +47,7 @@ import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNo
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode;
+import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalDeleteDataNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalInsertRowNode;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalInsertTabletNode;
import
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TreeDeviceSchemaCacheManager;
@@ -56,6 +57,7 @@ import org.apache.iotdb.db.storageengine.StorageEngine;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICompactionPerformer;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask;
+import
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.log.CompactionLogger;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionTaskManager;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.constant.InnerSequenceCompactionSelector;
@@ -65,8 +67,13 @@ import
org.apache.iotdb.db.storageengine.dataregion.flush.FlushManager;
import org.apache.iotdb.db.storageengine.dataregion.flush.TsFileFlushPolicy;
import org.apache.iotdb.db.storageengine.dataregion.memtable.ReadOnlyMemChunk;
import org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessor;
+import
org.apache.iotdb.db.storageengine.dataregion.modification.DeletionPredicate;
+import
org.apache.iotdb.db.storageengine.dataregion.modification.IDPredicate.NOP;
+import
org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFile;
+import
org.apache.iotdb.db.storageengine.dataregion.modification.TableDeletionEntry;
import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
import
org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator;
import org.apache.iotdb.db.storageengine.rescon.memory.MemTableManager;
import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
@@ -80,6 +87,7 @@ import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.apache.tsfile.read.TimeValuePair;
+import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.read.reader.IPointReader;
import org.apache.tsfile.utils.BitMap;
import org.apache.tsfile.write.record.TSRecord;
@@ -2004,6 +2012,44 @@ public class DataRegionTest {
Assert.assertFalse(tsFileResourceUnSeq.anyModFileExists());
}
+ @Test
+ public void testTableDeletionFallsBackToModsForCompactingFile() throws
Exception {
+ RelationalInsertTabletNode insertTabletNode = genInsertTabletNode(10, 0);
+ dataRegion.insertTablet(insertTabletNode);
+ dataRegion.syncCloseAllWorkingTsFileProcessors();
+
+ TsFileResource sourceTsFile =
dataRegion.getTsFileManager().getTsFileList(true).get(0);
+
assertTrue(sourceTsFile.transformStatus(TsFileResourceStatus.COMPACTION_CANDIDATE));
+ assertTrue(sourceTsFile.transformStatus(TsFileResourceStatus.COMPACTING));
+
+ TsFileResource targetTsFile =
+ new TsFileResource(new File(sourceTsFile.getTsFile().getParent(),
"target.tsfile"));
+ CompactionUtils.prepareCompactionModFiles(
+ Collections.singletonList(targetTsFile),
Collections.singletonList(sourceTsFile));
+ Assert.assertFalse(targetTsFile.anyModFileExists());
+
+ TableDeletionEntry deletionEntry =
+ new TableDeletionEntry(
+ new DeletionPredicate(StatementTestUtils.tableName(), new NOP()),
+ new TimeRange(Long.MIN_VALUE, Long.MAX_VALUE));
+ dataRegion.deleteByTable(
+ new RelationalDeleteDataNode(
+ new PlanNodeId("table-delete"), deletionEntry,
dataRegion.getDatabaseName()));
+
+ assertTrue(sourceTsFile.getTsFile().exists());
+ assertTrue(sourceTsFile.isCompacting());
+ assertTrue(sourceTsFile.anyModFileExists());
+ assertTrue(targetTsFile.anyModFileExists());
+ try {
+ targetTsFile.getModFileForWrite().close();
+ Assert.assertEquals(
+ Collections.singletonList(deletionEntry),
+ ModificationFile.readAllModifications(targetTsFile.getTsFile(),
false));
+ } finally {
+ targetTsFile.removeModFile();
+ }
+ }
+
@Test
public void testFlushSpecifiedResource()
throws IllegalPathException, WriteProcessException, ExecutionException,
InterruptedException {