[IOTDB-4518] Fix cannot delete .cmt -> .meta file in disk (#7423)
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/compaction/task/CompactionRecoverTask.java b/server/src/main/java/org/apache/iotdb/db/engine/compaction/task/CompactionRecoverTask.java
index ba632aa..2b19623 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/compaction/task/CompactionRecoverTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/compaction/task/CompactionRecoverTask.java
@@ -36,6 +36,7 @@
import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
import org.apache.iotdb.tsfile.utils.TsFileUtils;
+import org.apache.iotdb.tsfile.write.writer.TsFileIOWriter;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
@@ -349,6 +350,12 @@
File tmpTargetFile = targetFileIdentifier.getFileFromDataDirs();
if (tmpTargetFile != null) {
tmpTargetFile.delete();
+ File chunkMetadataTempFile =
+ new File(
+ tmpTargetFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX);
+ if (chunkMetadataTempFile.exists()) {
+ chunkMetadataTempFile.delete();
+ }
}
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
index 851f03c..6cf00f8 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
@@ -45,6 +45,7 @@
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import org.apache.iotdb.tsfile.write.writer.tsmiterator.TSMIterator;
+import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -116,7 +117,7 @@
protected boolean enableMemoryControl = false;
private Path lastSerializePath = null;
protected LinkedList<Long> endPosInCMTForDevice = new LinkedList<>();
- public static final String CHUNK_METADATA_TEMP_FILE_SUFFIX = ".cmt";
+ public static final String CHUNK_METADATA_TEMP_FILE_SUFFIX = ".meta";
/** empty construct function. */
protected TsFileIOWriter() {}
@@ -313,6 +314,12 @@
if (resourceLogger.isDebugEnabled() && file != null) {
resourceLogger.debug("{} writer is closed.", file.getName());
}
+ if (file != null) {
+ File chunkMetadataFile = new File(file.getAbsolutePath() + CHUNK_METADATA_TEMP_FILE_SUFFIX);
+ if (chunkMetadataFile.exists()) {
+ FileUtils.delete(chunkMetadataFile);
+ }
+ }
canWrite = false;
}
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java
index 44e4af3..b7c6ff8 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java
@@ -293,6 +293,9 @@
Assert.assertTrue(writer.hasChunkMetadataInDisk);
writer.endFile();
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -377,6 +380,9 @@
Assert.assertTrue(writer.hasChunkMetadataInDisk);
writer.endFile();
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -464,6 +470,9 @@
Assert.assertFalse(writer.chunkGroupMetadataList.isEmpty());
writer.endFile();
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -552,6 +561,9 @@
} finally {
TEST_CHUNK_SIZE = originTestChunkSize;
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -640,6 +652,9 @@
} finally {
TEST_CHUNK_SIZE = originTestChunkSize;
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originTimes);
}
@@ -728,6 +743,9 @@
} finally {
TEST_CHUNK_SIZE = originTestChunkSize;
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originTimes);
}
@@ -762,6 +780,9 @@
writer.endFile();
Assert.assertTrue(writer.hasChunkMetadataInDisk);
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -798,6 +819,9 @@
writer.endFile();
Assert.assertTrue(writer.hasChunkMetadataInDisk);
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -840,6 +864,9 @@
} finally {
TEST_CHUNK_SIZE = originTestPointNum;
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -878,6 +905,9 @@
} finally {
TEST_CHUNK_SIZE = originTestPointNum;
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -934,6 +964,9 @@
}
writer.endFile();
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originValue);
}
@@ -1030,6 +1063,9 @@
writer.endFile();
Assert.assertTrue(writer.hasChunkMetadataInDisk);
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originData);
}
@@ -1081,6 +1117,9 @@
}
writer.endFile();
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originValue);
}
@@ -1136,6 +1175,9 @@
}
writer.endFile();
}
+ Assert.assertFalse(
+ new File(testFile.getAbsolutePath() + TsFileIOWriter.CHUNK_METADATA_TEMP_FILE_SUFFIX)
+ .exists());
TsFileIntegrityCheckingTool.checkIntegrityBySequenceRead(testFile.getPath());
TsFileIntegrityCheckingTool.checkIntegrityByQuery(testFile.getPath(), originValue);
}