This is an automated email from the ASF dual-hosted git repository. shuwenwei pushed a commit to branch removeIsTableModelMethod in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d05671245a632f4e1b4a1e19ca2d091cbe65c4d3 Author: shuwenwei <[email protected]> AuthorDate: Fri Oct 9 11:39:23 2026 +0800 [Storage] Pass table model explicitly in compaction paths --- .../performer/impl/FastCompactionPerformer.java | 8 ++-- .../impl/ReadChunkCompactionPerformer.java | 2 +- .../impl/ReadPointCompactionPerformer.java | 2 +- .../execute/utils/CompactionPathUtils.java | 10 +++-- .../compaction/execute/utils/CompactionUtils.java | 15 ++++---- .../execute/utils/MultiTsFileDeviceIterator.java | 45 ++++++++++++++-------- .../fast/FastAlignedSeriesCompactionExecutor.java | 6 ++- .../FastNonAlignedSeriesCompactionExecutor.java | 2 +- .../executor/fast/SeriesCompactionExecutor.java | 5 ++- .../selector/impl/SettleSelectorImpl.java | 7 +++- .../apache/iotdb/db/utils/ModificationUtils.java | 20 ++++++---- .../compaction/utils/CompactionUtilsTest.java | 11 +++--- 12 files changed, 81 insertions(+), 52 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java index 9b57f56499a..4af31968488 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java @@ -183,7 +183,6 @@ public class FastCompactionPerformer // actually exist but the judgment return device being existed. sortedSourceFiles.addAll(seqFiles); sortedSourceFiles.addAll(unseqFiles); - boolean isTreeModel = !isAligned || device.getTableName().startsWith("root."); long ttl = deviceIterator.getTTLForCurrentDevice(); sortedSourceFiles.removeIf(x -> x.definitelyNotContains(device)); // checked above @@ -193,7 +192,9 @@ public class FastCompactionPerformer if (ttl != Long.MAX_VALUE) { ttlDeletion = CompactionUtils.convertTtlToDeletion( - device, deviceIterator.getTimeLowerBoundForCurrentDevice()); + device, + deviceIterator.getTimeLowerBoundForCurrentDevice(), + deviceIterator.isTableModel()); } compactionWriter.setTTLDeletion(ttlDeletion); @@ -205,7 +206,8 @@ public class FastCompactionPerformer compactionWriter.startChunkGroup(device, isAligned); if (isAligned) { - compactAlignedSeries(device, deviceIterator, compactionWriter, isTreeModel); + compactAlignedSeries( + device, deviceIterator, compactionWriter, !deviceIterator.isTableModel()); } else { compactNonAlignedSeries(device, deviceIterator, compactionWriter); } 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 da2e15db500..82bdbd3e649 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 @@ -256,7 +256,7 @@ public class ReadChunkCompactionPerformer implements ISeqCompactionPerformer { readerAndChunkMetadataList, writer, summary, - device.getTableName().startsWith("root.")); + !deviceIterator.isTableModel()); compactionExecutor.execute(); for (ChunkMetadata chunkMetadata : writer.getChunkMetadataListOfCurrentDeviceInMemory()) { if (chunkMetadata.getMeasurementUid().isEmpty()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java index 8ba6cebb82d..517f88cda77 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java @@ -223,7 +223,7 @@ public class ReadPointCompactionPerformer .map(IMeasurementSchema::getMeasurementName) .collect(Collectors.toList()); - fragmentInstanceContext.setIgnoreAllNullRows(device.getTableName().startsWith("root.")); + fragmentInstanceContext.setIgnoreAllNullRows(!deviceIterator.isTableModel()); IDataBlockReader dataBlockReader = constructReader( device, diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java index 898ea1729f0..fcde517479a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java @@ -31,13 +31,15 @@ public class CompactionPathUtils { private CompactionPathUtils() {} - public static MeasurementPath getPath(final IDeviceID device, final String measurement) + public static MeasurementPath getPath( + final IDeviceID device, final String measurement, final boolean isTableModel) throws IllegalPathException { - return getPath(device).concatAsMeasurementPath(measurement); + return getPath(device, isTableModel).concatAsMeasurementPath(measurement); } - public static PartialPath getPath(final IDeviceID device) throws IllegalPathException { - if (device.isTableModel()) { + public static PartialPath getPath(final IDeviceID device, final boolean isTableModel) + throws IllegalPathException { + if (isTableModel) { final String[] nodes = new String[device.segmentNum()]; nodes[0] = device.getTableName(); for (int i = 0; i < device.segmentNum() - 1; i++) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java index d26ecdb2129..55143751f18 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java @@ -428,12 +428,13 @@ public class CompactionUtils { PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> patternTreeMap, IDeviceID deviceID, String measurement, - ModEntry ttlDeletion) + ModEntry ttlDeletion, + boolean isTableModel) throws IllegalPathException { if ((patternTreeMap == null) || patternTreeMap.isEmpty()) { return ttlDeletion == null ? Collections.emptyList() : Collections.singletonList(ttlDeletion); } - PartialPath path = CompactionPathUtils.getPath(deviceID, measurement); + PartialPath path = CompactionPathUtils.getPath(deviceID, measurement, isTableModel); List<ModEntry> modEntries = patternTreeMap.getOverlapped(path); if (ttlDeletion != null) { if (!(modEntries instanceof ArrayList)) { @@ -443,7 +444,7 @@ public class CompactionUtils { } modEntries.add(ttlDeletion); } - if (path.getIDeviceID().isTableModel()) { + if (isTableModel) { modEntries = modEntries.stream() .filter(e -> e.affects(path.getIDeviceID()) && e.affects(path.getMeasurement())) @@ -500,9 +501,9 @@ public class CompactionUtils { return resource.buildDeviceTimeIndex(); } - public static ModEntry convertTtlToDeletion(IDeviceID deviceID, long timeLowerBound) - throws IllegalPathException { - if (!deviceID.isTableModel()) { + public static ModEntry convertTtlToDeletion( + IDeviceID deviceID, long timeLowerBound, boolean isTableModel) throws IllegalPathException { + if (!isTableModel) { return new TreeDeletionEntry( new MeasurementPath(deviceID, IoTDBConstant.ONE_LEVEL_PATH_WILDCARD), Long.MIN_VALUE, @@ -524,7 +525,7 @@ public class CompactionUtils { PartialPath devicePath; PathPatternTree patternTree = new PathPatternTree(); try { - devicePath = CompactionPathUtils.getPath(deviceID); + devicePath = CompactionPathUtils.getPath(deviceID, false); for (String measurement : measurements) { patternTree.appendFullPath(devicePath, measurement); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java index b9c1224067b..1b5e64f5717 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java @@ -26,6 +26,7 @@ import org.apache.iotdb.commons.path.MeasurementPath; import org.apache.iotdb.commons.path.PatternTreeMap; import org.apache.iotdb.commons.schema.table.TsTable; import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema; +import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.db.queryengine.plan.analyze.cache.schema.DataNodeTTLCache; import org.apache.iotdb.db.schemaengine.lease.MetadataLeaseManager; import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache; @@ -82,10 +83,10 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { private final Map<TsFileResource, PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer>> modificationCache = new HashMap<>(); private Pair<IDeviceID, Boolean> currentDevice = null; - private boolean ignoreAllNullRows; private long ttlForCurrentDevice; private long timeLowerBoundForCurrentDevice; private final String databaseName; + private final boolean isTableModel; /** * Used for compaction with read chunk performer. @@ -94,6 +95,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { */ public MultiTsFileDeviceIterator(List<TsFileResource> tsFileResources) throws IOException { this.databaseName = tsFileResources.get(0).getDatabaseName(); + this.isTableModel = PathUtils.isTableModelDatabase(databaseName); this.tsFileResourcesSortedByDesc = new ArrayList<>(tsFileResources); this.tsFileResourcesSortedByAsc = new ArrayList<>(tsFileResources); // sort the files from the oldest to the newest @@ -131,6 +133,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { this.tsFileResourcesSortedByDesc = new ArrayList<>(seqResources); tsFileResourcesSortedByDesc.addAll(unseqResources); this.databaseName = tsFileResourcesSortedByDesc.get(0).getDatabaseName(); + this.isTableModel = PathUtils.isTableModelDatabase(databaseName); // sort the files from the newest to the oldest Collections.sort( this.tsFileResourcesSortedByDesc, TsFileResource::compareFileCreationOrderByDesc); @@ -156,6 +159,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { this.tsFileResourcesSortedByDesc = new ArrayList<>(seqResources); tsFileResourcesSortedByDesc.addAll(unseqResources); this.databaseName = tsFileResourcesSortedByDesc.get(0).getDatabaseName(); + this.isTableModel = PathUtils.isTableModelDatabase(databaseName); // sort tsfiles from the newest to the oldest Collections.sort( this.tsFileResourcesSortedByDesc, TsFileResource::compareFileCreationOrderByDesc); @@ -236,7 +240,6 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { IDeviceID deviceID = currentDevice.left; boolean isAligned = currentDevice.right; - ignoreAllNullRows = !isAligned || deviceID.getTableName().startsWith("root."); if (MetadataLeaseManager.getInstance().isFenced()) { // Metadata lease fenced: this DataNode may hold a stale TTL (it could have missed a // ConfigNode @@ -245,7 +248,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { // deletes nothing by TTL while fenced, and real TTL deletion resumes once the lease recovers // and the cache resyncs. (Checked first so the table path also avoids the fenced cache.) ttlForCurrentDevice = Long.MAX_VALUE; - } else if (!ignoreAllNullRows) { + } else if (isTableModel) { ttlForCurrentDevice = DataNodeTTLCache.getInstance().getTTLForTable(databaseName, deviceID.getTableName()); } else { @@ -262,6 +265,10 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { return databaseName; } + public boolean isTableModel() { + return isTableModel; + } + public long getTTLForCurrentDevice() { return ttlForCurrentDevice; } @@ -271,9 +278,9 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { } public Map<String, MeasurementSchema> getAllSchemasOfCurrentDevice() throws IOException { - return ignoreAllNullRows - ? getAllSchemasOfCurrentDeviceForTree() - : getAllSchemasOfCurrentDeviceForTable(); + return isTableModel + ? getAllSchemasOfCurrentDeviceForTable() + : getAllSchemasOfCurrentDeviceForTree(); } /** @@ -448,9 +455,9 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { */ public Map<String, Pair<MeasurementSchema, Map<TsFileResource, Pair<Long, Long>>>> getTimeseriesSchemaAndMetadataOffsetOfCurrentDevice() throws IOException { - return ignoreAllNullRows - ? getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTree() - : getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTable(); + return isTableModel + ? getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTable() + : getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTree(); } @SuppressWarnings({"checkstyle:AtclauseOrderCheck", "squid:S3824"}) @@ -613,7 +620,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { TsFileSequenceReader reader = readerMap.get(tsFileResource); List<AbstractAlignedChunkMetadata> alignedChunkMetadataList = reader.getAlignedChunkMetadataByMetadataIndexNode( - currentDevice.left, firstMeasurementNodeOfCurrentDevice, ignoreAllNullRows); + currentDevice.left, firstMeasurementNodeOfCurrentDevice, !isTableModel); applyModificationForAlignedChunkMetadataList(tsFileResource, alignedChunkMetadataList); readerAndChunkMetadataList.add(new Pair<>(reader, alignedChunkMetadataList)); } @@ -638,7 +645,9 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { ModEntry ttlDeletion = null; Optional<Long> startTime = tsFileResource.getStartTime(device); if (startTime.isPresent() && startTime.get() < timeLowerBoundForCurrentDevice) { - ttlDeletion = CompactionUtils.convertTtlToDeletion(device, timeLowerBoundForCurrentDevice); + ttlDeletion = + CompactionUtils.convertTtlToDeletion( + device, timeLowerBoundForCurrentDevice, isTableModel); } PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> modifications = @@ -652,7 +661,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { // match time column modifications List<ModEntry> modificationForTimeColumn = CompactionUtils.getMatchedModifications( - modifications, device, AlignedPath.VECTOR_PLACEHOLDER, ttlDeletion); + modifications, device, AlignedPath.VECTOR_PLACEHOLDER, ttlDeletion, isTableModel); // match value column modifications List<List<ModEntry>> modificationForValueColumns = new ArrayList<>(); @@ -663,7 +672,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { } List<ModEntry> modificationList = CompactionUtils.getMatchedModifications( - modifications, device, valueChunkMetadata.getMeasurementUid(), null); + modifications, device, valueChunkMetadata.getMeasurementUid(), null, isTableModel); modificationForValueColumns.add( modificationList.isEmpty() ? Collections.emptyList() : modificationList); } @@ -672,7 +681,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { alignedChunkMetadataList, modificationForTimeColumn, modificationForValueColumns, - ignoreAllNullRows); + !isTableModel); } public Map<TsFileResource, TsFileSequenceReader> getReaderMap() { @@ -884,7 +893,11 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { // collect the modifications for current series List<ModEntry> modificationForCurrentSeries = CompactionUtils.getMatchedModifications( - modificationsInThisResource, device, currentCompactingSeries, ttlDeletion); + modificationsInThisResource, + device, + currentCompactingSeries, + ttlDeletion, + isTableModel); // if there are modifications of current series, apply them to the chunk metadata if (!modificationForCurrentSeries.isEmpty()) { @@ -902,7 +915,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable { // skip data of deleted table private boolean isCurrentDeviceDataInDeprecatedTable(TsFileResource resource) { - if (ignoreAllNullRows) { + if (!isTableModel) { return false; } String tableName = currentDevice.getLeft().getTableName(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java index cf9ed65b819..718373058f6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java @@ -247,7 +247,8 @@ public class FastAlignedSeriesCompactionExecutor extends SeriesCompactionExecuto // get time modifications of this file List<ModEntry> timeModifications = - getModificationsFromCache(resource, deviceId, AlignedPath.VECTOR_PLACEHOLDER); + getModificationsFromCache( + resource, deviceId, AlignedPath.VECTOR_PLACEHOLDER, !ignoreAllNullRows); // get value modifications of this file List<List<ModEntry>> valueModifications = new ArrayList<>(); alignedChunkMetadataList @@ -260,7 +261,8 @@ public class FastAlignedSeriesCompactionExecutor extends SeriesCompactionExecuto valueModifications.add(null); } else { valueModifications.add( - getModificationsFromCache(resource, deviceId, x.getMeasurementUid())); + getModificationsFromCache( + resource, deviceId, x.getMeasurementUid(), !ignoreAllNullRows)); } } catch (IllegalPathException e) { throw new RuntimeException(e); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java index 49cbcb14582..b187a568b84 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java @@ -160,7 +160,7 @@ public class FastNonAlignedSeriesCompactionExecutor extends SeriesCompactionExec ModificationUtils.modifyChunkMetaData( iChunkMetadataList, getModificationsFromCache( - resource, deviceId, iChunkMetadataList.get(0).getMeasurementUid())); + resource, deviceId, iChunkMetadataList.get(0).getMeasurementUid(), false)); if (iChunkMetadataList.isEmpty()) { // all chunks has been deleted in this file, just remove it removeFile(fileElement); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java index b3073bd3d25..1452b27f239 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java @@ -474,7 +474,7 @@ public abstract class SeriesCompactionExecutor { * modification from ttl cache. */ protected List<ModEntry> getModificationsFromCache( - TsFileResource tsFileResource, IDeviceID deviceId, String measurement) + TsFileResource tsFileResource, IDeviceID deviceId, String measurement, boolean isTableModel) throws IllegalPathException { PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> allModifications = modificationCacheMap.get(tsFileResource.getTsFile().getName()); @@ -482,7 +482,8 @@ public abstract class SeriesCompactionExecutor { allModifications, deviceId, measurement, - compactionWriter.getTTLLowerBoundForCurrentDevice()); + compactionWriter.getTTLLowerBoundForCurrentDevice(), + isTableModel); } @SuppressWarnings("squid:S3776") diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java index 61f8229cd3c..774a1d3cfe9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java @@ -23,6 +23,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.AlignedPath; import org.apache.iotdb.commons.path.PatternTreeMap; import org.apache.iotdb.commons.utils.CommonDateTimeUtils; +import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.i18n.StorageEngineMessages; @@ -67,6 +68,7 @@ public class SettleSelectorImpl implements ISettleSelector { private final boolean heavySelect; private final String storageGroupName; private final String dataRegionId; + private final boolean isTableModel; private final long timePartition; private final TsFileManager tsFileManager; private boolean isSeq; @@ -83,6 +85,7 @@ public class SettleSelectorImpl implements ISettleSelector { this.heavySelect = heavySelect; this.storageGroupName = storageGroupName; this.dataRegionId = dataRegionId; + this.isTableModel = PathUtils.isTableModelDatabase(storageGroupName); this.timePartition = timePartition; this.tsFileManager = tsFileManager; this.context = context; @@ -261,7 +264,7 @@ public class SettleSelectorImpl implements ISettleSelector { long ttl; String tableName = device.getTableName(); boolean hasSetTTL; - if (tableName.startsWith("root.")) { + if (!isTableModel) { ttl = DataNodeTTLCache.getInstance().getTTLForTree(device); hasSetTTL = ttl != Long.MAX_VALUE; } else { @@ -327,7 +330,7 @@ public class SettleSelectorImpl implements ISettleSelector { throws IllegalPathException { return ModificationUtils.isAllDeletedByMods( CompactionUtils.getMatchedModifications( - modifications, device, AlignedPath.VECTOR_PLACEHOLDER, null), + modifications, device, AlignedPath.VECTOR_PLACEHOLDER, null, isTableModel), startTime, endTime); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java index 0ea1abee866..e6dd6170ae6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java @@ -280,16 +280,17 @@ public class ModificationUtils { final PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> modifications, final IDeviceID device, final long startTime, - final long endTime) + final long endTime, + final boolean isTableModel) throws IllegalPathException { final List<ModEntry> mods = modifications.getOverlapped( - CompactionPathUtils.getPath(device, AlignedPath.VECTOR_PLACEHOLDER)); + CompactionPathUtils.getPath(device, AlignedPath.VECTOR_PLACEHOLDER, isTableModel)); return mods.stream() .anyMatch( modification -> modification.getTimeRange().contains(startTime, endTime) - && (!device.isTableModel() || modification.affects(device))); + && (!isTableModel || modification.affects(device))); } public static boolean isAllDeletedByMods( @@ -310,15 +311,16 @@ public class ModificationUtils { final IDeviceID device, final String measurement, final long startTime, - final long endTime) + final long endTime, + final boolean isTableModel) throws IllegalPathException { final List<ModEntry> mods = - modifications.getOverlapped(CompactionPathUtils.getPath(device, measurement)); + modifications.getOverlapped(CompactionPathUtils.getPath(device, measurement, isTableModel)); return mods.stream() .anyMatch( modification -> modification.getTimeRange().contains(startTime, endTime) - && (!device.isTableModel() + && (!isTableModel || modification.affects(device) && modification.affects(measurement))); } @@ -452,7 +454,8 @@ public class ModificationUtils { public static boolean isDeviceDeletedByMods( final PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> currentModifications, final ITimeIndex currentTimeIndex, - final IDeviceID device) + final IDeviceID device, + final boolean isTableModel) throws IllegalPathException { return isAllDeletedByMods( currentModifications, @@ -462,6 +465,7 @@ public class ModificationUtils { : currentTimeIndex.getStartTime(device).orElse(Long.MIN_VALUE), Objects.isNull(currentTimeIndex) ? Long.MAX_VALUE - : currentTimeIndex.getEndTime(device).orElse(Long.MAX_VALUE)); + : currentTimeIndex.getEndTime(device).orElse(Long.MAX_VALUE), + isTableModel); } } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java index 2a0890e6277..f7c0ab41053 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java @@ -59,10 +59,11 @@ public class CompactionUtilsTest extends AbstractCompactionTest { IDeviceID deviceID = new StringArrayDeviceID(new String[] {"db.table1", null, "tag1"}); Assert.assertArrayEquals( - new String[] {"db.table1", null, "tag1"}, CompactionPathUtils.getPath(deviceID).getNodes()); + new String[] {"db.table1", null, "tag1"}, + CompactionPathUtils.getPath(deviceID, true).getNodes()); Assert.assertArrayEquals( new String[] {"db.table1", null, "tag1", "s1"}, - CompactionPathUtils.getPath(deviceID, "s1").getNodes()); + CompactionPathUtils.getPath(deviceID, "s1", true).getNodes()); } @Test @@ -71,9 +72,9 @@ public class CompactionUtilsTest extends AbstractCompactionTest { IDeviceID deviceID = deletionPath.getIDeviceID(); Assert.assertArrayEquals( - new String[] {"root", "repro"}, CompactionPathUtils.getPath(deviceID).getNodes()); + new String[] {"root", "repro"}, CompactionPathUtils.getPath(deviceID, false).getNodes()); Assert.assertArrayEquals( - deletionPath.getNodes(), CompactionPathUtils.getPath(deviceID, "s1").getNodes()); + deletionPath.getNodes(), CompactionPathUtils.getPath(deviceID, "s1", false).getNodes()); TreeDeletionEntry deletion = new TreeDeletionEntry(deletionPath, Long.MIN_VALUE, Long.MAX_VALUE); @@ -82,7 +83,7 @@ public class CompactionUtilsTest extends AbstractCompactionTest { modifications.append(deletion.keyOfPatternTree(), deletion); List<ModEntry> matchedModifications = - CompactionUtils.getMatchedModifications(modifications, deviceID, "s1", null); + CompactionUtils.getMatchedModifications(modifications, deviceID, "s1", null, false); Assert.assertEquals(1, matchedModifications.size()); Assert.assertEquals( deletionPath, ((TreeDeletionEntry) matchedModifications.get(0)).getPathPattern());
