From f6afc4ea3ff2bcd2ec22ebc138638715ade762e6 Mon Sep 17 00:00:00 2001 From: Nero Date: Tue, 9 Dec 2025 22:18:31 +0800 Subject: [PATCH 1/4] Remove the code check port is occupied, and resolve the problem that can't rename file successfully. --- .../commons/file/SystemPropertiesHandler.java | 6 +-- scripts/sbin/windows/start-confignode.bat | 28 ----------- scripts/sbin/windows/start-datanode.bat | 48 ------------------- 3 files changed, 3 insertions(+), 79 deletions(-) diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/file/SystemPropertiesHandler.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/file/SystemPropertiesHandler.java index dfbb2104cfb8d..b23bf2630f403 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/file/SystemPropertiesHandler.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/file/SystemPropertiesHandler.java @@ -21,9 +21,9 @@ import org.apache.iotdb.commons.conf.ConfigurationFileUtils; import org.apache.iotdb.commons.conf.IoTDBConstant; +import org.apache.iotdb.commons.utils.FileUtils; import org.apache.ratis.util.AutoCloseableLock; -import org.apache.ratis.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -185,8 +185,8 @@ private void replaceFormalFile() throws IOException { throw new IOException(msg); } try { - FileUtils.move(tmpFile.toPath(), formalFile.toPath()); - } catch (IOException e) { + FileUtils.moveFileSafe(tmpFile, formalFile); + } catch (Exception e) { String msg = String.format( "Failed to replace formal system properties file, you may manually rename it: %s -> %s", diff --git a/scripts/sbin/windows/start-confignode.bat b/scripts/sbin/windows/start-confignode.bat index 2501a0645c2a5..64efa6f5580ff 100644 --- a/scripts/sbin/windows/start-confignode.bat +++ b/scripts/sbin/windows/start-confignode.bat @@ -111,34 +111,6 @@ IF DEFINED CONFIG_FILE ( set cn_consensus_port=10720 ) -echo Check whether the ports are occupied.... -set occupied=0 -set cn_internal_port_occupied=0 -set cn_consensus_port_occupied=0 -for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do ( - if %%i==TCP ( - if %%j==%cn_internal_port% ( - if !cn_internal_port_occupied!==0 ( - echo The cn_internal_port %cn_internal_port% is already occupied, pid:%%k - set occupied=1 - set cn_internal_port_occupied=1 - ) - ) else if %%j==%cn_consensus_port% ( - if !cn_consensus_port_occupied!==0 ( - echo The cn_consensus_port %cn_consensus_port% is already occupied, pid:%%k - set occupied=1 - set cn_consensus_port_occupied=1 - ) - ) - ) -) - -if %occupied%==1 ( - echo There exists occupied port, please change the configuration. - TIMEOUT /T 10 /NOBREAK - exit 0 -) - set CONF_PARAMS=-s if NOT DEFINED MAIN_CLASS set MAIN_CLASS=org.apache.iotdb.confignode.service.ConfigNode if NOT DEFINED JAVA_HOME goto :err diff --git a/scripts/sbin/windows/start-datanode.bat b/scripts/sbin/windows/start-datanode.bat index 30a7aa50e8367..0cf3e6487839d 100755 --- a/scripts/sbin/windows/start-datanode.bat +++ b/scripts/sbin/windows/start-datanode.bat @@ -146,54 +146,6 @@ IF DEFINED CONFIG_FILE ( set dn_data_region_consensus_port=10760 ) -echo Check whether the ports are occupied.... -set occupied=0 -set dn_rpc_port_occupied=0 -set dn_internal_port_occupied=0 -set dn_mpp_data_exchange_port_occupied=0 -set dn_schema_region_consensus_port_occupied=0 -set dn_data_region_consensus_port_occupied=0 -for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do ( - if %%i==TCP ( - if %%j==%dn_rpc_port% ( - if !dn_rpc_port_occupied!==0 ( - echo The dn_rpc_port %dn_rpc_port% is already occupied, pid:%%k - set occupied=1 - set dn_rpc_port_occupied=1 - ) - ) else if %%j==%dn_internal_port% ( - if !dn_internal_port_occupied!==0 ( - echo The dn_internal_port %dn_internal_port% is already occupied, pid:%%k - set occupied=1 - set dn_internal_port_occupied=1 - ) - ) else if %%j==%dn_mpp_data_exchange_port% ( - if !dn_mpp_data_exchange_port_occupied!==0 ( - echo The dn_mpp_data_exchange_port %dn_mpp_data_exchange_port% is already occupied, pid:%%k - set occupied=1 - set dn_mpp_data_exchange_port_occupied=1 - ) - ) else if %%j==%dn_schema_region_consensus_port% ( - if !dn_schema_region_consensus_port_occupied!==0 ( - echo The dn_schema_region_consensus_port %dn_schema_region_consensus_port% is already occupied, pid:%%k - set occupied=1 - set dn_schema_region_consensus_port_occupied=1 - ) - ) else if %%j==%dn_data_region_consensus_port% ( - if !dn_data_region_consensus_port_occupied!==0 ( - echo The dn_data_region_consensus_port %dn_data_region_consensus_port% is already occupied, pid:%%k - set occupied=1 - ) - ) - ) -) - -if %occupied%==1 ( - echo There exists occupied port, please change the configuration. - TIMEOUT /T 10 /NOBREAK - exit 0 -) - @setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS set CONF_PARAMS=-s if NOT DEFINED MAIN_CLASS set MAIN_CLASS=org.apache.iotdb.db.service.DataNode From f9b7f9dd75b662bc5e8995bc539ea0e203a3a202 Mon Sep 17 00:00:00 2001 From: Nero Date: Fri, 19 Dec 2025 17:54:23 +0800 Subject: [PATCH 2/4] Only delete data, but don't delete tsfile when performing a drop column statement on the table model or a drop tag statement on the tree model. --- .../apache/iotdb/db/it/IoTDBDeletionIT.java | 52 +++++++++ .../it/db/it/IoTDBDeletionTableIT.java | 109 ++++++++++++++++++ .../it/session/IoTDBSessionRelationalIT.java | 2 +- .../storageengine/dataregion/DataRegion.java | 15 ++- 4 files changed, 176 insertions(+), 2 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java index 17ceb9b696255..e00dad90df7f4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java @@ -488,6 +488,58 @@ public void testDeleteByRangeComparison() throws SQLException { } } + @Test + public void testDropAndAlter() throws SQLException { + try (Connection connection = EnvFactory.getEnv().getConnection(); + Statement statement = connection.createStatement()) { + statement.execute("CREATE DATABASE root.test"); + statement.execute( + "CREATE TIMESERIES root.test.g_0.d3.s_10 with datatype=INT32 tags(tag1=v1, tag2=v2)"); + + // time=1 and time=2 are INT32 and deleted by drop column + statement.execute("INSERT INTO root.test.g_0.d3(timestamp, s_10) VALUES(1, 1)"); + + statement.execute("FLUSH"); + + statement.execute("INSERT INTO root.test.g_0.d3(timestamp, s_10) VALUES(2, 2)"); + + statement.execute("ALTER TIMESERIES root.test.g_0.d3.s_10 DROP tag1"); + + // time=3 and time=4 are STRING + statement.execute("INSERT INTO root.test.g_0.d3(timestamp, s_10) VALUES(3, 3)"); + + statement.execute("FLUSH"); + + statement.execute("INSERT INTO root.test.g_0.d3(timestamp, s_10) VALUES(4, 4)"); + + statement.execute("ALTER TIMESERIES root.test.g_0.d3.s_10 ADD TAGS tag1=v1"); + + // time=5 and time=6 are TEXT + statement.execute("INSERT INTO root.test.g_0.d3(timestamp, s_10) VALUES(5, 5)"); + + statement.execute("FLUSH"); + + statement.execute("INSERT INTO root.test.g_0.d3(timestamp, s_10) VALUES(6, 6)"); + + try (ResultSet dataSet = + statement.executeQuery("select * from root.test.g_0.d3 order by time")) { + // s1 is dropped but the time should remain + int i = 1; + while (dataSet.next()) { + assertEquals(i, dataSet.getLong(1)); + i++; + } + Assert.assertEquals(6, i - 1); + assertFalse(dataSet.next()); + } + } finally { + try (Connection connection = EnvFactory.getEnv().getConnection(); + Statement statement = connection.createStatement()) { + statement.execute("DROP DATABASE root.test"); + } + } + } + private static void prepareSeries() { try (Connection connection = EnvFactory.getEnv().getConnection(); Statement statement = connection.createStatement()) { diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java index 3d61b64e71a64..18d5333da5a3a 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java @@ -33,8 +33,11 @@ import org.apache.iotdb.rpc.IoTDBConnectionException; import org.apache.iotdb.rpc.StatementExecutionException; +import org.apache.tsfile.enums.ColumnCategory; +import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.read.common.RowRecord; import org.apache.tsfile.read.common.TimeRange; +import org.apache.tsfile.write.record.Tablet; import org.awaitility.Awaitility; import org.junit.After; import org.junit.AfterClass; @@ -60,6 +63,7 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Random; @@ -74,6 +78,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.apache.iotdb.relational.it.session.IoTDBSessionRelationalIT.genValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -2268,6 +2273,110 @@ public void testMultiDeviceCompletelyDeleteTable() throws SQLException { cleanData(testNum); } + @Test + public void testDropAndAlter() throws IoTDBConnectionException, StatementExecutionException { + try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) { + session.executeNonQueryStatement("CREATE TABLE IF NOT EXISTS drop_and_alter (s1 int32)"); + + // time=1 and time=2 are INT32 and deleted by drop column + Tablet tablet = + new Tablet( + "drop_and_alter", + Collections.singletonList("s1"), + Collections.singletonList(TSDataType.INT32), + Collections.singletonList(ColumnCategory.FIELD)); + tablet.addTimestamp(0, 1); + tablet.addValue("s1", 0, genValue(TSDataType.INT32, 1)); + session.insert(tablet); + tablet.reset(); + + session.executeNonQueryStatement("FLUSH"); + + tablet = + new Tablet( + "drop_and_alter", + Collections.singletonList("s1"), + Collections.singletonList(TSDataType.INT32), + Collections.singletonList(ColumnCategory.FIELD)); + tablet.addTimestamp(0, 2); + tablet.addValue("s1", 0, genValue(TSDataType.INT32, 2)); + session.insert(tablet); + tablet.reset(); + + session.executeNonQueryStatement("ALTER TABLE drop_and_alter DROP COLUMN s1"); + + // time=3 and time=4 are STRING + tablet = + new Tablet( + "drop_and_alter", + Collections.singletonList("s1"), + Collections.singletonList(TSDataType.STRING), + Collections.singletonList(ColumnCategory.FIELD)); + tablet.addTimestamp(0, 3); + tablet.addValue("s1", 0, genValue(TSDataType.STRING, 3)); + session.insert(tablet); + tablet.reset(); + + session.executeNonQueryStatement("FLUSH"); + + tablet = + new Tablet( + "drop_and_alter", + Collections.singletonList("s1"), + Collections.singletonList(TSDataType.STRING), + Collections.singletonList(ColumnCategory.FIELD)); + tablet.addTimestamp(0, 4); + tablet.addValue("s1", 0, genValue(TSDataType.STRING, 4)); + session.insert(tablet); + tablet.reset(); + + session.executeNonQueryStatement("ALTER TABLE drop_and_alter DROP COLUMN s1"); + session.executeNonQueryStatement("ALTER TABLE drop_and_alter ADD COLUMN s1 TEXT"); + + // time=5 and time=6 are TEXT + tablet = + new Tablet( + "drop_and_alter", + Collections.singletonList("s1"), + Collections.singletonList(TSDataType.TEXT), + Collections.singletonList(ColumnCategory.FIELD)); + tablet.addTimestamp(0, 5); + tablet.addValue("s1", 0, genValue(TSDataType.STRING, 5)); + session.insert(tablet); + tablet.reset(); + + session.executeNonQueryStatement("FLUSH"); + + tablet = + new Tablet( + "drop_and_alter", + Collections.singletonList("s1"), + Collections.singletonList(TSDataType.TEXT), + Collections.singletonList(ColumnCategory.FIELD)); + tablet.addTimestamp(0, 6); + tablet.addValue("s1", 0, genValue(TSDataType.STRING, 6)); + session.insert(tablet); + tablet.reset(); + + SessionDataSet dataSet = + session.executeQueryStatement("select * from drop_and_alter order by time"); + // s1 is dropped but the time should remain + RowRecord rec; + int cnt = 0; + for (int i = 1; i < 7; i++) { + rec = dataSet.next(); + assertEquals(i, rec.getFields().get(0).getLongV()); + cnt++; + } + Assert.assertEquals(6, cnt); + assertFalse(dataSet.hasNext()); + } finally { + try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) { + session.executeNonQueryStatement("DROP TABLE IF EXISTS drop_and_alter"); + } + } + } + private static void prepareDatabase() { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java index 9c02ac94208ae..6ae696ba454d4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java @@ -1596,7 +1596,7 @@ private void testOneCastWithRow( } @SuppressWarnings("SameParameterValue") - private Object genValue(TSDataType dataType, int i) { + public static Object genValue(TSDataType dataType, int i) { switch (dataType) { case INT32: return i; 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 09c9ee8430415..73805045c37ad 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 @@ -3030,6 +3030,19 @@ private void deleteDataInSealedFiles(Collection sealedTsFiles, M Set involvedModificationFiles = new HashSet<>(); List deletedByMods = new ArrayList<>(); List deletedByFiles = new ArrayList<>(); + boolean isDropMeasurementExist = false; + boolean isDropTagExist = false; + + if (deletion instanceof TableDeletionEntry) { + TableDeletionEntry entry = (TableDeletionEntry) deletion; + isDropMeasurementExist = !entry.getPredicate().getMeasurementNames().isEmpty(); + } else { + TreeDeletionEntry entry = (TreeDeletionEntry) deletion; + if (entry.getPathPattern() instanceof MeasurementPath) { + isDropTagExist = !((MeasurementPath) entry.getPathPattern()).getTagMap().isEmpty(); + } + } + for (TsFileResource sealedTsFile : sealedTsFiles) { if (canSkipDelete(sealedTsFile, deletion)) { continue; @@ -3126,7 +3139,7 @@ private void deleteDataInSealedFiles(Collection sealedTsFiles, M } // else do nothing } - if (!deletedByFiles.isEmpty()) { + if (!deletedByFiles.isEmpty() && !isDropMeasurementExist && !isDropTagExist) { deleteTsFileCompletely(deletedByFiles); if (logger.isDebugEnabled()) { logger.debug( From 8c92be627d3351c9a4f1e0bdc255e8bc20a14aad Mon Sep 17 00:00:00 2001 From: Nero Date: Fri, 19 Dec 2025 19:21:18 +0800 Subject: [PATCH 3/4] Fix NPE --- .../apache/iotdb/db/storageengine/dataregion/DataRegion.java | 3 ++- 1 file changed, 2 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 73805045c37ad..b3e3dce4e3342 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 @@ -3039,7 +3039,8 @@ private void deleteDataInSealedFiles(Collection sealedTsFiles, M } else { TreeDeletionEntry entry = (TreeDeletionEntry) deletion; if (entry.getPathPattern() instanceof MeasurementPath) { - isDropTagExist = !((MeasurementPath) entry.getPathPattern()).getTagMap().isEmpty(); + Map tagMap = ((MeasurementPath) entry.getPathPattern()).getTagMap(); + isDropTagExist = (tagMap != null) && !tagMap.isEmpty(); } } From 8b91c88571b53533f096b62ce5fb45d2f4c90a32 Mon Sep 17 00:00:00 2001 From: Nero Date: Sun, 21 Dec 2025 23:53:35 +0800 Subject: [PATCH 4/4] Don't delete tsfile when use tag as a where clause in the delete statement on table model. --- .../it/db/it/IoTDBDeletionTableIT.java | 60 +++++++++++++++++++ .../storageengine/dataregion/DataRegion.java | 18 +++--- .../modification/DeletionPredicate.java | 4 ++ 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java index 18d5333da5a3a..7abb5d2ca05d1 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java @@ -2273,6 +2273,59 @@ public void testMultiDeviceCompletelyDeleteTable() throws SQLException { cleanData(testNum); } + @Test + public void testDeleteDataByTag() throws IoTDBConnectionException, StatementExecutionException { + try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) { + session.executeNonQueryStatement( + "CREATE TABLE IF NOT EXISTS delete_by_tag (deviceId STRING TAG, s1 INT32 FIELD)"); + + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (1, 'sensor', 1)"); + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (2, 'sensor', 2)"); + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (3, 'sensor', 3)"); + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (4, 'sensor', 4)"); + + session.executeNonQueryStatement("DELETE FROM delete_by_tag WHERE deviceId = 'sensor'"); + + SessionDataSet dataSet = + session.executeQueryStatement("select * from delete_by_tag order by time"); + assertFalse(dataSet.hasNext()); + + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (1, 'sensor', 1)"); + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (2, 'sensor', 2)"); + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (3, 'sensor', 3)"); + session.executeNonQueryStatement( + "insert into delete_by_tag (time, deviceId, s1) values (4, 'sensor', 4)"); + session.executeNonQueryStatement("FLUSH"); + + session.executeNonQueryStatement("DELETE FROM delete_by_tag WHERE deviceId = 'sensor'"); + + dataSet = session.executeQueryStatement("select * from delete_by_tag order by time"); + + RowRecord rec; + int cnt = 0; + for (int i = 1; i < 5; i++) { + rec = dataSet.next(); + assertEquals(i, rec.getFields().get(0).getLongV()); + Assert.assertEquals(i, rec.getFields().get(2).getIntV()); + Assert.assertEquals(TSDataType.INT32, rec.getFields().get(2).getDataType()); + cnt++; + } + Assert.assertEquals(4, cnt); + assertFalse(dataSet.hasNext()); + } finally { + try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) { + session.executeNonQueryStatement("DROP TABLE IF EXISTS delete_by_tag"); + } + } + } + @Test public void testDropAndAlter() throws IoTDBConnectionException, StatementExecutionException { try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) { @@ -2366,6 +2419,13 @@ public void testDropAndAlter() throws IoTDBConnectionException, StatementExecuti for (int i = 1; i < 7; i++) { rec = dataSet.next(); assertEquals(i, rec.getFields().get(0).getLongV()); + LOGGER.error( + "time is {}, value is {}, value type is {}", + rec.getFields().get(0).getLongV(), + rec.getFields().get(1), + rec.getFields().get(1).getDataType()); + // assertNull(rec.getFields().get(1).getDataType()); + // Assert.assertEquals(TSDataType.TEXT, rec.getFields().get(1).getDataType()); cnt++; } Assert.assertEquals(6, cnt); 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 b3e3dce4e3342..a4aa20c3de3b6 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 @@ -114,6 +114,7 @@ import org.apache.iotdb.db.storageengine.dataregion.memtable.IMemTable; import org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessor; import org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessorInfo; +import org.apache.iotdb.db.storageengine.dataregion.modification.IDPredicate; import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry; import org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFile; import org.apache.iotdb.db.storageengine.dataregion.modification.TableDeletionEntry; @@ -3031,17 +3032,12 @@ private void deleteDataInSealedFiles(Collection sealedTsFiles, M List deletedByMods = new ArrayList<>(); List deletedByFiles = new ArrayList<>(); boolean isDropMeasurementExist = false; - boolean isDropTagExist = false; + IDPredicate.IDPredicateType idPredicateType = null; if (deletion instanceof TableDeletionEntry) { - TableDeletionEntry entry = (TableDeletionEntry) deletion; - isDropMeasurementExist = !entry.getPredicate().getMeasurementNames().isEmpty(); - } else { - TreeDeletionEntry entry = (TreeDeletionEntry) deletion; - if (entry.getPathPattern() instanceof MeasurementPath) { - Map tagMap = ((MeasurementPath) entry.getPathPattern()).getTagMap(); - isDropTagExist = (tagMap != null) && !tagMap.isEmpty(); - } + TableDeletionEntry tableDeletionEntry = (TableDeletionEntry) deletion; + isDropMeasurementExist = !tableDeletionEntry.getPredicate().getMeasurementNames().isEmpty(); + idPredicateType = tableDeletionEntry.getPredicate().getIdPredicateType(); } for (TsFileResource sealedTsFile : sealedTsFiles) { @@ -3140,7 +3136,9 @@ private void deleteDataInSealedFiles(Collection sealedTsFiles, M } // else do nothing } - if (!deletedByFiles.isEmpty() && !isDropMeasurementExist && !isDropTagExist) { + if (!deletedByFiles.isEmpty() + && !isDropMeasurementExist + && idPredicateType.equals(IDPredicate.IDPredicateType.NOP)) { deleteTsFileCompletely(deletedByFiles); if (logger.isDebugEnabled()) { logger.debug( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java index 7e79e8f580dc5..294999788fa70 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java @@ -72,6 +72,10 @@ public void setIdPredicate(IDPredicate idPredicate) { this.idPredicate = idPredicate; } + public IDPredicate.IDPredicateType getIdPredicateType() { + return this.idPredicate.type; + } + public String getTableName() { return tableName; }