diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBLoadTsFileIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBLoadTsFileIT.java index fa5e0ecc31341..6640277eddbab 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBLoadTsFileIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBLoadTsFileIT.java @@ -25,6 +25,8 @@ import org.apache.iotdb.db.it.utils.TestUtils; import org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFile; import org.apache.iotdb.db.storageengine.dataregion.modification.TreeDeletionEntry; +import org.apache.iotdb.db.storageengine.dataregion.modification.v1.ModificationFileV1; +import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.env.cluster.node.DataNodeWrapper; import org.apache.iotdb.it.framework.IoTDBTestRunner; @@ -1010,6 +1012,31 @@ public void testLoadWithEmptyTsFile() throws Exception { } } + @Test + public void testDeleteEmptyTsFileAfterLoad() throws Exception { + final File tsFile = new File(tmpDir, "empty-1-0-0-0.tsfile"); + try (final TsFileGenerator ignored = new TsFileGenerator(tsFile)) {} + + final File resourceFile = new File(tsFile.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX); + final File modsFile = ModificationFile.getExclusiveMods(tsFile); + final File modsV1File = new File(tsFile.getAbsolutePath() + ModificationFileV1.FILE_SUFFIX); + + Assert.assertTrue(resourceFile.createNewFile()); + Assert.assertTrue(modsFile.createNewFile()); + Assert.assertTrue(modsV1File.createNewFile()); + + try (final Connection connection = EnvFactory.getEnv().getConnection(); + final Statement statement = connection.createStatement()) { + statement.execute( + String.format("load \"%s\" with ('on-success'='delete')", tsFile.getAbsolutePath())); + + Assert.assertFalse(tsFile.exists()); + Assert.assertFalse(resourceFile.exists()); + Assert.assertFalse(modsFile.exists()); + Assert.assertFalse(modsV1File.exists()); + } + } + @Test public void testAsyncLoadKeepsSameNamedTsFilesWithModsIsolated() throws Exception { registerSchema(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileAnalyzer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileAnalyzer.java index e11fa2c977af4..8ceea29ceef0c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileAnalyzer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileAnalyzer.java @@ -26,6 +26,7 @@ import org.apache.iotdb.commons.queryengine.common.SessionInfo; import org.apache.iotdb.commons.queryengine.common.SqlDialect; import org.apache.iotdb.commons.queryengine.utils.TimestampPrecisionUtils; +import org.apache.iotdb.commons.utils.RetryUtils; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.exception.load.LoadAnalyzeException; import org.apache.iotdb.db.exception.load.LoadAnalyzeMissingSchemaException; @@ -42,6 +43,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LoadTsFile; import org.apache.iotdb.db.queryengine.plan.statement.crud.LoadTsFileStatement; +import org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFile; 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.utils.TsFileResourceUtils; @@ -68,6 +70,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.BufferUnderflowException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -489,7 +492,10 @@ && handleSingleMiniFile(i)) { DataNodeQueryMessages.EMPTY_FILE_DETECTED_WILL_SKIP_LOADING_THIS_FILE, tsFile.getAbsolutePath()); if (isDeleteAfterLoad) { - org.apache.iotdb.commons.utils.FileUtils.deleteFileIfExist(tsFile); + deleteFile(tsFile); + deleteFile(new File(LoadUtil.getTsFileResourcePath(tsFile.getAbsolutePath()))); + deleteFile(ModificationFile.getExclusiveMods(tsFile)); + deleteFile(new File(LoadUtil.getTsFileModsV1Path(tsFile.getAbsolutePath()))); } } finally { // reset the session info to the original one @@ -497,6 +503,18 @@ && handleSingleMiniFile(i)) { } } + private void deleteFile(final File file) { + try { + RetryUtils.retryOnException( + () -> { + Files.deleteIfExists(file.toPath()); + return null; + }); + } catch (final Exception e) { + LOGGER.warn(DataNodeQueryMessages.DELETE_AFTER_LOADING_ERROR, file, e); + } + } + private boolean handleSingleMiniFile(final int i) throws FileNotFoundException { final long startTime = System.nanoTime(); try {