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

xingtanzjr 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 bbc57ec98ff Check empty target file after sequence 
InnerSpaceCompactionTask (#11454)
bbc57ec98ff is described below

commit bbc57ec98ff5351f97353cef7fcc51cc30d86cc3
Author: shuwenwei <[email protected]>
AuthorDate: Thu Nov 9 17:03:38 2023 +0800

    Check empty target file after sequence InnerSpaceCompactionTask (#11454)
---
 .../impl/ReadChunkCompactionPerformer.java         |  3 +
 .../execute/task/AbstractCompactionTask.java       | 61 +++++++++++++----
 .../execute/task/CrossSpaceCompactionTask.java     |  5 +-
 .../execute/task/InnerSpaceCompactionTask.java     | 28 +++-----
 .../task/InsertionCrossSpaceCompactionTask.java    | 18 ++---
 .../compaction/io/CompactionTsFileWriter.java      | 11 +++
 .../FastInnerCompactionPerformerTest.java          |  2 +-
 .../compaction/ReadChunkInnerCompactionTest.java   | 80 ++++++++++++++++++++++
 ...sSpaceCompactionWithReadPointPerformerTest.java |  4 +-
 .../inner/InnerCompactionEmptyTsFileTest.java      |  2 +-
 .../tsfile/write/chunk/AlignedChunkWriterImpl.java |  5 ++
 .../iotdb/tsfile/write/chunk/ChunkWriterImpl.java  |  5 ++
 .../iotdb/tsfile/write/chunk/IChunkWriter.java     |  3 +
 13 files changed, 179 insertions(+), 48 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
index 78c1d0bc965..80fc8b1dcb3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
@@ -92,6 +92,9 @@ public class ReadChunkCompactionPerformer implements 
ISeqCompactionPerformer {
         targetResource.updatePlanIndexes(tsFileResource);
       }
       writer.endFile();
+      if (writer.isEmptyTargetFile()) {
+        targetResource.forceMarkDeleted();
+      }
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
index a7571b3abe1..7d828b9f030 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
@@ -44,7 +44,9 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * AbstractCompactionTask is the base class for all compaction task, it 
carries out the execution of
@@ -372,21 +374,56 @@ public abstract class AbstractCompactionTask {
     return CompactionUtils.isDiskHasSpace();
   }
 
-  protected void validateTsFileResource(
-      List<TsFileResource> targetTsFileList, boolean needValidateOverlap) {
+  protected void validateCompactionResult(
+      List<TsFileResource> sourceSeqFiles,
+      List<TsFileResource> sourceUnseqFiles,
+      List<TsFileResource> targetFiles)
+      throws CompactionValidationFailedException {
+    // skip TsFileResource which is marked as DELETED status
+    List<TsFileResource> validTargetFiles =
+        targetFiles.stream().filter(resource -> 
!resource.isDeleted()).collect(Collectors.toList());
+    CompactionTaskType taskType = getCompactionTaskType();
+    boolean needToValidateTsFileCorrectness = taskType != 
CompactionTaskType.INSERTION;
+    boolean needToValidatePartitionSeqSpaceOverlap =
+        getCompactionTaskType() != CompactionTaskType.INNER_UNSEQ;
+
     TsFileValidator validator = TsFileValidator.getInstance();
-    if (!validator.validateTsFiles(targetTsFileList)) {
-      LOGGER.error("Failed to pass compaction validation, target files is {}", 
targetTsFileList);
-      throw new CompactionValidationFailedException(
-          "Failed to pass compaction validation, .resources file or tsfile 
data is wrong");
+    if (needToValidatePartitionSeqSpaceOverlap) {
+      List<TsFileResource> timePartitionSeqFiles =
+          new 
ArrayList<>(tsFileManager.getOrCreateSequenceListByTimePartition(timePartition));
+      timePartitionSeqFiles.removeAll(sourceSeqFiles);
+      timePartitionSeqFiles.addAll(validTargetFiles);
+      timePartitionSeqFiles.sort(
+          (f1, f2) -> {
+            int timeDiff =
+                Long.compareUnsigned(
+                    Long.parseLong(f1.getTsFile().getName().split("-")[0]),
+                    Long.parseLong(f2.getTsFile().getName().split("-")[0]));
+            return timeDiff == 0
+                ? Long.compareUnsigned(
+                    Long.parseLong(f1.getTsFile().getName().split("-")[1]),
+                    Long.parseLong(f2.getTsFile().getName().split("-")[1]))
+                : timeDiff;
+          });
+      if (!validator.validateTsFilesIsHasNoOverlap(timePartitionSeqFiles)) {
+        LOGGER.error(
+            "Failed to pass compaction validation, source seq files: {}, 
source unseq files: {}, target files: {}",
+            sourceSeqFiles,
+            sourceUnseqFiles,
+            targetFiles);
+        throw new CompactionValidationFailedException(
+            "Failed to pass compaction validation, sequence files has overlap, 
time partition id is "
+                + timePartition);
+      }
     }
-    if (needValidateOverlap
-        && !validator.validateTsFilesIsHasNoOverlap(
-            
tsFileManager.getOrCreateSequenceListByTimePartition(timePartition).getArrayList()))
 {
-      LOGGER.error("Failed to pass compaction validation, target files is {}", 
targetTsFileList);
+    if (needToValidateTsFileCorrectness && 
!validator.validateTsFiles(validTargetFiles)) {
+      LOGGER.error(
+          "Failed to pass compaction validation, source seq files: {}, source 
unseq files: {}, target files: {}",
+          sourceSeqFiles,
+          sourceUnseqFiles,
+          targetFiles);
       throw new CompactionValidationFailedException(
-          "Failed to pass compaction validation, sequence files has overlap, 
time partition id is "
-              + timePartition);
+          "Failed to pass compaction validation, .resources file or tsfile 
data is wrong");
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
index a833907a4a8..b52eb86049f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
@@ -196,6 +196,9 @@ public class CrossSpaceCompactionTask extends 
AbstractCompactionTask {
         CompactionUtils.combineModsInCrossCompaction(
             selectedSequenceFiles, selectedUnsequenceFiles, 
targetTsfileResourceList);
 
+        validateCompactionResult(
+            selectedSequenceFiles, selectedUnsequenceFiles, 
targetTsfileResourceList);
+
         // update tsfile resource in memory
         tsFileManager.replace(
             selectedSequenceFiles,
@@ -213,8 +216,6 @@ public class CrossSpaceCompactionTask extends 
AbstractCompactionTask {
           }
         }
 
-        validateTsFileResource(targetTsfileResourceList, true);
-
         lockWrite(selectedSequenceFiles);
         lockWrite(selectedUnsequenceFiles);
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
index 6221d5c1821..a8334f8e6d4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
@@ -219,22 +219,18 @@ public class InnerSpaceCompactionTask extends 
AbstractCompactionTask {
               String.format("%s-%s [Compaction] abort", storageGroupName, 
dataRegionId));
         }
 
+        validateCompactionResult(
+            sequence ? selectedTsFileResourceList : Collections.emptyList(),
+            sequence ? Collections.emptyList() : selectedTsFileResourceList,
+            targetTsFileList);
+
         // replace the old files with new file, the new is in same position as 
the old
-        if (sequence) {
-          tsFileManager.replace(
-              selectedTsFileResourceList,
-              Collections.emptyList(),
-              targetTsFileList,
-              timePartition,
-              true);
-        } else {
-          tsFileManager.replace(
-              Collections.emptyList(),
-              selectedTsFileResourceList,
-              targetTsFileList,
-              timePartition,
-              false);
-        }
+        tsFileManager.replace(
+            sequence ? selectedTsFileResourceList : Collections.emptyList(),
+            sequence ? Collections.emptyList() : selectedTsFileResourceList,
+            targetTsFileList,
+            timePartition,
+            sequence);
 
         if (targetTsFileResource.isDeleted()) {
           compactionLogger.logEmptyTargetFile(targetTsFileResource);
@@ -242,8 +238,6 @@ public class InnerSpaceCompactionTask extends 
AbstractCompactionTask {
           compactionLogger.force();
         }
 
-        validateTsFileResource(targetTsFileList, sequence);
-
         LOGGER.info(
             "{}-{} [Compaction] Compacted target files, try to get the write 
lock of source files",
             storageGroupName,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
index 95ad2a68efd..704999cdcd1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
@@ -22,7 +22,6 @@ package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.service.metrics.FileMetrics;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.CompactionRecoverException;
-import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.CompactionValidationFailedException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.log.CompactionLogAnalyzer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.log.CompactionLogger;
@@ -34,7 +33,6 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
 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.dataregion.utils.validate.TsFileValidator;
 
 import java.io.File;
 import java.io.IOException;
@@ -149,20 +147,14 @@ public class InsertionCrossSpaceCompactionTask extends 
AbstractCompactionTask {
 
       prepareTargetFiles();
 
+      validateCompactionResult(
+          Collections.emptyList(),
+          Collections.singletonList(unseqFileToInsert),
+          Collections.singletonList(targetFile));
+
       replaceTsFileInMemory(
           Collections.singletonList(unseqFileToInsert), 
Collections.singletonList(targetFile));
 
-      if (!TsFileValidator.getInstance()
-          .validateTsFilesIsHasNoOverlap(
-              
tsFileManager.getOrCreateSequenceListByTimePartition(timePartition))) {
-        LOGGER.error(
-            "Failed to pass compaction validation, source un seq files is: {}, 
target files is {}",
-            unseqFileToInsert,
-            targetFile);
-        
IoTDBDescriptor.getInstance().getConfig().setEnableInsertionCrossSpaceCompaction(false);
-        throw new CompactionValidationFailedException("Failed to pass 
compaction validation");
-      }
-
       lockWrite(Collections.singletonList(unseqFileToInsert));
       CompactionUtils.deleteCompactionModsFile(selectedSeqFiles, 
selectedUnseqFiles);
       CompactionUtils.deleteSourceTsFileAndUpdateFileMetrics(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
index 3ed52d0dc51..251a65d23ed 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
@@ -41,6 +41,7 @@ public class CompactionTsFileWriter extends TsFileIOWriter {
   CompactionType type;
 
   private volatile boolean isWritingAligned = false;
+  private boolean isEmptyTargetFile = true;
 
   public CompactionTsFileWriter(
       File file, boolean enableMemoryControl, long maxMetadataSize, 
CompactionType type)
@@ -60,6 +61,9 @@ public class CompactionTsFileWriter extends TsFileIOWriter {
   public void writeChunk(IChunkWriter chunkWriter) throws IOException {
     boolean isAligned = chunkWriter instanceof AlignedChunkWriterImpl;
     long beforeOffset = this.getPos();
+    if (!chunkWriter.isEmpty()) {
+      isEmptyTargetFile = false;
+    }
     chunkWriter.writeToFileWriter(this);
     long writtenDataSize = this.getPos() - beforeOffset;
     acquireWrittenDataSizeWithCompactionWriteRateLimiter(writtenDataSize);
@@ -73,6 +77,9 @@ public class CompactionTsFileWriter extends TsFileIOWriter {
   @Override
   public void writeChunk(Chunk chunk, ChunkMetadata chunkMetadata) throws 
IOException {
     long beforeOffset = this.getPos();
+    if (chunkMetadata.getNumOfPoints() != 0) {
+      isEmptyTargetFile = false;
+    }
     super.writeChunk(chunk, chunkMetadata);
     long writtenDataSize = this.getPos() - beforeOffset;
     acquireWrittenDataSizeWithCompactionWriteRateLimiter(writtenDataSize);
@@ -131,4 +138,8 @@ public class CompactionTsFileWriter extends TsFileIOWriter {
       }
     }
   }
+
+  public boolean isEmptyTargetFile() {
+    return isEmptyTargetFile;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/FastInnerCompactionPerformerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/FastInnerCompactionPerformerTest.java
index 675375ab399..f6005213f44 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/FastInnerCompactionPerformerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/FastInnerCompactionPerformerTest.java
@@ -949,7 +949,7 @@ public class FastInnerCompactionPerformerTest extends 
AbstractCompactionTest {
     InnerSpaceCompactionTask task =
         new InnerSpaceCompactionTask(
             0, tsFileManager, unseqResources, false, new 
FastCompactionPerformer(false), 0);
-    Assert.assertFalse(task.start());
+    Assert.assertTrue(task.start());
     Assert.assertEquals(0, 
FileReaderManager.getInstance().getClosedFileReaderMap().size());
     Assert.assertEquals(0, 
FileReaderManager.getInstance().getUnclosedFileReaderMap().size());
     validateSeqFiles(true);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadChunkInnerCompactionTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadChunkInnerCompactionTest.java
index 0ce1c8f2812..a3ca978bb3c 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadChunkInnerCompactionTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadChunkInnerCompactionTest.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadChunkCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask;
+import 
org.apache.iotdb.db.storageengine.dataregion.compaction.utils.CompactionTestFileWriter;
 import 
org.apache.iotdb.db.storageengine.dataregion.read.control.FileReaderManager;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
@@ -40,6 +41,7 @@ import org.apache.iotdb.tsfile.write.chunk.IChunkWriter;
 import org.apache.iotdb.tsfile.write.writer.TsFileIOWriter;
 
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -363,4 +365,82 @@ public class ReadChunkInnerCompactionTest extends 
AbstractCompactionTest {
 
     validateTargetDatas(sourceDatas, tsDataTypes);
   }
+
+  @Test
+  public void testReadChunkPerformerWithEmptyTargetFile1() throws IOException {
+    TsFileResource seqFile1 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile1)) {
+      writer.endFile();
+    }
+    TsFileResource seqFile2 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile2)) {
+      writer.endFile();
+    }
+    TsFileResource seqFile3 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile3)) {
+      writer.endFile();
+    }
+    seqResources.add(seqFile1);
+    seqResources.add(seqFile2);
+    seqResources.add(seqFile3);
+    InnerSpaceCompactionTask task =
+        new InnerSpaceCompactionTask(
+            0, tsFileManager, seqResources, true, new 
ReadChunkCompactionPerformer(), 0);
+    Assert.assertTrue(task.start());
+    Assert.assertEquals(0, tsFileManager.getTsFileList(true).size());
+  }
+
+  @Test
+  public void testReadChunkPerformerWithEmptyTargetFile2() throws IOException {
+    TsFileResource seqFile1 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile1)) {
+      writer.endFile();
+    }
+    TsFileResource seqFile2 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile2)) {
+      writer.endFile();
+    }
+    TsFileResource seqFile3 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile3)) {
+      writer.startChunkGroup("d1");
+      writer.endChunkGroup();
+      writer.endFile();
+    }
+    seqResources.add(seqFile1);
+    seqResources.add(seqFile2);
+    seqResources.add(seqFile3);
+    InnerSpaceCompactionTask task =
+        new InnerSpaceCompactionTask(
+            0, tsFileManager, seqResources, true, new 
ReadChunkCompactionPerformer(), 0);
+    Assert.assertTrue(task.start());
+    Assert.assertEquals(0, tsFileManager.getTsFileList(true).size());
+  }
+
+  @Test
+  public void testReadChunkPerformerWithNonEmptyTargetFile() throws 
IOException {
+    TsFileResource seqFile1 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile1)) {
+      writer.endFile();
+    }
+    TsFileResource seqFile2 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile2)) {
+      writer.endFile();
+    }
+    TsFileResource seqFile3 = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(seqFile3)) {
+      writer.startChunkGroup("d1");
+      writer.generateSimpleNonAlignedSeriesToCurrentDevice(
+          "s1", new TimeRange[] {new TimeRange(1, 2)}, TSEncoding.PLAIN, 
CompressionType.LZ4);
+      writer.endChunkGroup();
+      writer.endFile();
+    }
+    seqResources.add(seqFile1);
+    seqResources.add(seqFile2);
+    seqResources.add(seqFile3);
+    InnerSpaceCompactionTask task =
+        new InnerSpaceCompactionTask(
+            0, tsFileManager, seqResources, true, new 
ReadChunkCompactionPerformer(), 0);
+    Assert.assertTrue(task.start());
+    Assert.assertEquals(1, tsFileManager.getTsFileList(true).size());
+  }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
index 3245e29357b..4ed2d5a9b81 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
@@ -458,10 +458,10 @@ public class 
RewriteCrossSpaceCompactionWithReadPointPerformerTest extends Abstr
     task.start();
 
     for (TsFileResource resource : seqResources) {
-      Assert.assertTrue(resource.getModFile().exists());
+      Assert.assertFalse(resource.getModFile().exists());
     }
     for (TsFileResource resource : unseqResources) {
-      Assert.assertTrue(resource.getModFile().exists());
+      Assert.assertFalse(resource.getModFile().exists());
     }
     for (TsFileResource resource : targetResources) {
       resource.setFile(
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerCompactionEmptyTsFileTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerCompactionEmptyTsFileTest.java
index d1182bdc20d..86dbeddf3a5 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerCompactionEmptyTsFileTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerCompactionEmptyTsFileTest.java
@@ -89,6 +89,6 @@ public class InnerCompactionEmptyTsFileTest extends 
InnerCompactionTest {
     Future<CompactionTaskSummary> future =
         
CompactionTaskManager.getInstance().getCompactionTaskFutureMayBlock(task);
     unseqResources.get(0).readUnlock();
-    Assert.assertFalse(future.get().isSuccess());
+    Assert.assertTrue(future.get().isSuccess());
   }
 }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/AlignedChunkWriterImpl.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/AlignedChunkWriterImpl.java
index 3d9e66c9198..d44850d2322 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/AlignedChunkWriterImpl.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/AlignedChunkWriterImpl.java
@@ -416,6 +416,11 @@ public class AlignedChunkWriterImpl implements 
IChunkWriter {
     return false;
   }
 
+  @Override
+  public boolean isEmpty() {
+    return timeChunkWriter.getPointNum() + 
timeChunkWriter.getPageWriter().getPointNumber() == 0;
+  }
+
   @Override
   public boolean checkIsUnsealedPageOverThreshold(
       long size, long pointNum, boolean returnTrueIfPageEmpty) {
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java
index f8f4a915720..a7f9176003b 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java
@@ -370,6 +370,11 @@ public class ChunkWriterImpl implements IChunkWriter {
         || statistics.getCount() + pageWriter.getPointNumber() >= pointNum;
   }
 
+  @Override
+  public boolean isEmpty() {
+    return statistics.getCount() + pageWriter.getPointNumber() == 0;
+  }
+
   public TSDataType getDataType() {
     return measurementSchema.getType();
   }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/IChunkWriter.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/IChunkWriter.java
index 0e0ba92348f..2550172ddfc 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/IChunkWriter.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/IChunkWriter.java
@@ -52,6 +52,9 @@ public interface IChunkWriter {
    */
   boolean checkIsChunkSizeOverThreshold(long size, long pointNum, boolean 
returnTrueIfChunkEmpty);
 
+  /** Return true if the chunk writer is empty */
+  boolean isEmpty();
+
   /**
    * used for compaction to check whether the unsealed page is over threshold 
or not. Return true if
    * there is no unsealed page.

Reply via email to