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.