This is an automated email from the ASF dual-hosted git repository.
jiangtian 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 36c7db80d15 fix redundant operations in compaction (#17239)
36c7db80d15 is described below
commit 36c7db80d15339443dd50a292e69c0f9a69145ed
Author: shuwenwei <[email protected]>
AuthorDate: Mon Mar 2 16:23:36 2026 +0800
fix redundant operations in compaction (#17239)
---
.../performer/impl/FastCompactionPerformer.java | 7 --
.../execute/utils/MultiTsFileDeviceIterator.java | 93 ++++------------------
.../fast/FastAlignedSeriesCompactionExecutor.java | 18 +++--
3 files changed, 26 insertions(+), 92 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 54b21ddd382..629493f184b 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
@@ -193,13 +193,6 @@ public class FastCompactionPerformer
ttlDeletion =
CompactionUtils.convertTtlToDeletion(
device, deviceIterator.getTimeLowerBoundForCurrentDevice());
- for (TsFileResource sourceFile : sortedSourceFiles) {
- modificationCache
- .computeIfAbsent(
- sourceFile.getTsFile().getName(),
- k -> PatternTreeMapFactory.getModsPatternTreeMap())
- .append(ttlDeletion.keyOfPatternTree(), ttlDeletion);
- }
}
compactionWriter.setTTLDeletion(ttlDeletion);
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 9099586e87e..31296771090 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
@@ -294,79 +294,9 @@ public class MultiTsFileDeviceIterator implements
AutoCloseable {
* Get all measurements and their timeseries metadata offset in each source
file. It is used for
* new fast compaction to compact nonAligned timeseries.
*
- * @return measurement -> tsfile resource -> timeseries metadata
<startOffset, endOffset>
+ * @return measurement -> CompactionSeriesContext
* @throws IOException if io errors occurred
*/
- public Map<String, Map<TsFileResource, Pair<Long, Long>>>
- getTimeseriesMetadataOffsetOfCurrentDevice() throws IOException {
- Map<String, Map<TsFileResource, Pair<Long, Long>>>
timeseriesMetadataOffsetMap =
- new HashMap<>();
- Map<String, TSDataType> measurementDataTypeMap = new HashMap<>();
- for (TsFileResource resource : tsFileResourcesSortedByDesc) {
- if (!deviceIteratorMap.containsKey(resource)
- || !deviceIteratorMap.get(resource).current().equals(currentDevice))
{
- // if this tsfile has no more device or next device is not equals to
the current device,
- // which means this tsfile does not contain the current device, then
skip it.
- continue;
- }
- TsFileSequenceReader reader = readerMap.get(resource);
- for (Map.Entry<String, Pair<TimeseriesMetadata, Pair<Long, Long>>>
entrySet :
- ((CompactionTsFileReader) reader)
- .getTimeseriesMetadataAndOffsetByDevice(
-
deviceIteratorMap.get(resource).getFirstMeasurementNodeOfCurrentDevice(),
- Collections.emptySet(),
- false)
- .entrySet()) {
- String measurementId = entrySet.getKey();
- // skip the TimeseriesMetadata whose data type is not consistent
- TSDataType dataTypeOfCurrentTimeseriesMetadata =
entrySet.getValue().left.getTsDataType();
- TSDataType correctDataTypeOfCurrentMeasurement =
- measurementDataTypeMap.putIfAbsent(measurementId,
dataTypeOfCurrentTimeseriesMetadata);
- if (correctDataTypeOfCurrentMeasurement != null
- && !MetadataUtils.canAlter(
- dataTypeOfCurrentTimeseriesMetadata,
correctDataTypeOfCurrentMeasurement)) {
- continue;
- }
- timeseriesMetadataOffsetMap.putIfAbsent(measurementId, new
HashMap<>());
- timeseriesMetadataOffsetMap.get(measurementId).put(resource,
entrySet.getValue().right);
- }
- }
- return timeseriesMetadataOffsetMap;
- }
-
- /**
- * Get all measurement data types of the current device from source files.
Traverse all the files
- * from the newest to the oldest in turn and start traversing the index tree
from the
- * firstMeasurementNode node to get all the measurement types under the
current device.
- *
- * @return measurement -> data type
- * @throws IOException if io errors occurred
- */
- public Map<String, TSDataType> getDataTypeOfCurrentDevice() throws
IOException {
- Map<String, TSDataType> measurementNameDataTypeMap = new HashMap<>();
- for (TsFileResource resource : tsFileResourcesSortedByDesc) {
- if (!deviceIteratorMap.containsKey(resource)
- || !deviceIteratorMap.get(resource).current().equals(currentDevice))
{
- // if this tsfile has no more device or next device is not equals to
the current device,
- // which means this tsfile does not contain the current device, then
skip it.
- continue;
- }
- TsFileSequenceReader reader = readerMap.get(resource);
- for (Map.Entry<String, Pair<TimeseriesMetadata, Pair<Long, Long>>>
entrySet :
- ((CompactionTsFileReader) reader)
- .getTimeseriesMetadataAndOffsetByDevice(
-
deviceIteratorMap.get(resource).getFirstMeasurementNodeOfCurrentDevice(),
- Collections.emptySet(),
- false)
- .entrySet()) {
- String measurementId = entrySet.getKey();
- TSDataType dataType = entrySet.getValue().left.getTsDataType();
- measurementNameDataTypeMap.putIfAbsent(measurementId, dataType);
- }
- }
- return measurementNameDataTypeMap;
- }
-
public Map<String, CompactionSeriesContext>
getCompactionSeriesContextOfCurrentDevice()
throws IOException {
Map<String, CompactionSeriesContext> compactionSeriesContextMap = new
HashMap<>();
@@ -388,16 +318,21 @@ public class MultiTsFileDeviceIterator implements
AutoCloseable {
String measurementId = entrySet.getKey();
TimeseriesMetadata timeseriesMetadata = entrySet.getValue().left;
Pair<Long, Long> offset = entrySet.getValue().right;
- TSDataType dataType = entrySet.getValue().left.getTsDataType();
- if (compactionSeriesContextMap.get(measurementId) != null
- && compactionSeriesContextMap.get(measurementId).getFinalType() !=
null
- && !MetadataUtils.canAlter(
- dataType,
compactionSeriesContextMap.get(measurementId).getFinalType())) {
+ TSDataType dataType = timeseriesMetadata.getTsDataType();
+
+ CompactionSeriesContext compactionSeriesContext =
+ compactionSeriesContextMap.get(measurementId);
+ if (compactionSeriesContext != null
+ && compactionSeriesContext.getFinalType() != null
+ && !MetadataUtils.canAlter(dataType,
compactionSeriesContext.getFinalType())) {
continue;
}
- compactionSeriesContextMap.putIfAbsent(measurementId, new
CompactionSeriesContext());
- compactionSeriesContextMap.get(measurementId).put(resource,
entrySet.getValue().right);
-
compactionSeriesContextMap.get(measurementId).setFinalTypeIfAbsent(dataType);
+
+ compactionSeriesContext =
+ compactionSeriesContextMap.computeIfAbsent(
+ measurementId, k -> new CompactionSeriesContext());
+ compactionSeriesContext.put(resource, offset);
+ compactionSeriesContext.setFinalTypeIfAbsent(dataType);
}
}
return compactionSeriesContextMap;
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 121d4ca1d3a..cf9ed65b819 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
@@ -276,21 +276,27 @@ public class FastAlignedSeriesCompactionExecutor extends
SeriesCompactionExecuto
private boolean isValueChunkDataTypeMatchSchema(
List<IChunkMetadata> chunkMetadataListOfOneValueColumn) {
- boolean isMatch = false;
+ boolean needAlter = false;
for (IChunkMetadata chunkMetadata : chunkMetadataListOfOneValueColumn) {
if (chunkMetadata == null) {
continue;
}
String measurement = chunkMetadata.getMeasurementUid();
IMeasurementSchema schema = measurementSchemaMap.get(measurement);
- if (MetadataUtils.canAlter(chunkMetadata.getDataType(),
schema.getType())) {
- if (schema.getType() != chunkMetadata.getDataType()) {
- chunkMetadata.setNewType(schema.getType());
+ if (!needAlter) {
+ // Since all chunks in chunkMetadataListOfOneValueColumn share the
same dataType, perform
+ // the compatibility check and early-return only on the first non-null
chunk.
+ if (!MetadataUtils.canAlter(chunkMetadata.getDataType(),
schema.getType())) {
+ return false;
+ }
+ if (schema.getType() == chunkMetadata.getDataType()) {
+ return true;
}
- isMatch = true;
}
+ needAlter = true;
+ chunkMetadata.setNewType(schema.getType());
}
- return isMatch;
+ return true;
}
/**