This is an automated email from the ASF dual-hosted git repository.
shuwenwei pushed a commit to branch table_disk_usage_statistics
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/table_disk_usage_statistics by
this push:
new b6787b4e808 fix
b6787b4e808 is described below
commit b6787b4e808370ac864209f775e1608b4051082f
Author: shuwenwei <[email protected]>
AuthorDate: Wed Dec 10 17:03:52 2025 +0800
fix
---
.../java/org/apache/iotdb/session/Session.java | 7 +-
.../InformationSchemaContentSupplierFactory.java | 5 +
.../plan/relational/sql/rewrite/ShowRewrite.java | 4 +-
.../execute/utils/MultiTsFileDeviceIterator.java | 4 +-
.../dataregion/utils/DiskUsageStatisticUtil.java | 111 +++++++++++++++++----
.../utils/TableDiskUsageStatisticUtil.java | 81 ++++++++++-----
.../utils/TreeDiskUsageStatisticUtil.java | 64 ++++++++----
7 files changed, 203 insertions(+), 73 deletions(-)
diff --git
a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
index 8844f36c247..ea7c7c85cd7 100644
--- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -3074,10 +3074,9 @@ public class Session implements ISession {
this.columnEncodersMap
.getOrDefault(
measurementSchema.getType(),
- TSEncoding.valueOf(
- TSFileDescriptor.getInstance()
- .getConfig()
- .getValueEncoder(measurementSchema.getType())))
+ TSFileDescriptor.getInstance()
+ .getConfig()
+ .getValueEncoder(measurementSchema.getType()))
.serialize());
}
} else {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
index 9115cd85025..08a35c9744d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
@@ -1252,6 +1252,7 @@ public class InformationSchemaContentSupplierFactory {
private DataRegion currentDataRegion;
private long currentTimePartition;
private List<String> currentTablesToScan;
+ private boolean currentDatabaseOnlyHasOneTable;
private TableDiskUsageStatisticUtil statisticUtil;
private final StorageEngineTimePartitionIterator timePartitionIterator;
@@ -1307,6 +1308,7 @@ public class InformationSchemaContentSupplierFactory {
currentDataRegion.getTsFileManager(),
currentTimePartition,
currentTablesToScan,
+ currentDatabaseOnlyHasOneTable,
Optional.ofNullable(operatorContext.getInstanceContext()));
return true;
}
@@ -1325,10 +1327,12 @@ public class InformationSchemaContentSupplierFactory {
}
List<String> tablesToScan = new ArrayList<>(tTableInfos.size());
+ int totalValidTableCount = 0;
for (TTableInfo tTableInfo : tTableInfos) {
if (tTableInfo.getType() != TableType.BASE_TABLE.ordinal()) {
continue;
}
+ totalValidTableCount++;
if (pushDownFilter != null) {
Object[] row = new Object[5];
row[0] = new Binary(dataRegion.getDatabaseName(),
TSFileConfig.STRING_CHARSET);
@@ -1350,6 +1354,7 @@ public class InformationSchemaContentSupplierFactory {
paginationController.consumeLimit();
tablesToScan.add(tTableInfo.getTableName());
}
+ currentDatabaseOnlyHasOneTable = totalValidTableCount == 1;
return tablesToScan;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
index 63693ae099f..12fd67d5017 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
@@ -60,7 +60,7 @@ public final class ShowRewrite implements
StatementRewrite.Rewrite {
final Map<NodeRef<Parameter>, Expression> parameterLookup,
final WarningCollector warningCollector) {
final Visitor visitor = new Visitor();
- return (Statement) visitor.process(node);
+ return (Statement) visitor.process(node, null);
}
private static class Visitor extends AstVisitor<Node, Void> {
@@ -85,7 +85,7 @@ public final class ShowRewrite implements
StatementRewrite.Rewrite {
}
@Override
- protected Node visitCountStatement(final CountStatement countStatement,
Void context) {
+ protected Node visitCountStatement(final CountStatement countStatement,
final Void context) {
return simpleQuery(
new Select(
false,
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 076d2de5a03..4dfa5a05661 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
@@ -175,7 +175,7 @@ public class MultiTsFileDeviceIterator implements
AutoCloseable {
}
}
- public boolean hasNextDevice() {
+ public boolean hasNextDevice() throws IOException {
boolean hasNext = false;
for (TsFileDeviceIterator iterator : deviceIteratorMap.values()) {
hasNext =
@@ -196,7 +196,7 @@ public class MultiTsFileDeviceIterator implements
AutoCloseable {
* @return Pair of device full path and whether this device is aligned
*/
@SuppressWarnings({"squid:S135", "java:S2259"})
- public Pair<IDeviceID, Boolean> nextDevice() throws IllegalPathException {
+ public Pair<IDeviceID, Boolean> nextDevice() throws IllegalPathException,
IOException {
List<TsFileResource> toBeRemovedResources = new LinkedList<>();
Pair<IDeviceID, Boolean> minDevice = null;
// get the device from source files sorted from the newest to the oldest
by version
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
index 20e43010308..07296d217d2 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
@@ -25,11 +25,12 @@ import
org.apache.iotdb.db.storageengine.dataregion.read.control.FileReaderManag
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.tsfile.file.IMetadataIndexEntry;
import org.apache.tsfile.file.header.ChunkGroupHeader;
import org.apache.tsfile.file.metadata.IChunkMetadata;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.MetadataIndexNode;
-import org.apache.tsfile.file.metadata.TimeseriesMetadata;
+import org.apache.tsfile.file.metadata.enums.MetadataIndexNodeType;
import org.apache.tsfile.read.TsFileSequenceReader;
import org.apache.tsfile.utils.Pair;
import org.slf4j.Logger;
@@ -37,11 +38,11 @@ import org.slf4j.LoggerFactory;
import java.io.Closeable;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.Queue;
import java.util.function.LongConsumer;
@@ -108,7 +109,9 @@ public abstract class DiskUsageStatisticUtil implements
Closeable {
public void calculateNextFile() {
TsFileResource tsFileResource = iterator.next();
- if (tsFileResource.isDeleted()) {
+ if (tsFileResource.isDeleted() ||
calculateWithoutOpenFile(tsFileResource)) {
+ iterator.remove();
+ tsFileResource.readUnlock();
return;
}
FileReaderManager.getInstance().increaseFileReaderReference(tsFileResource,
true);
@@ -130,39 +133,72 @@ public abstract class DiskUsageStatisticUtil implements
Closeable {
}
}
+ protected abstract boolean calculateWithoutOpenFile(TsFileResource
tsFileResource);
+
protected abstract void calculateNextFile(
TsFileResource tsFileResource, TsFileSequenceReader reader)
throws IOException, IllegalPathException;
- protected long calculateStartOffsetOfChunkGroup(
+ protected Offsets calculateStartOffsetOfChunkGroupAndTimeseriesMetadata(
TsFileSequenceReader reader,
MetadataIndexNode firstMeasurementNodeOfCurrentDevice,
- Pair<IDeviceID, Boolean> deviceIsAlignedPair)
+ Pair<IDeviceID, Boolean> deviceIsAlignedPair,
+ long rootMeasurementNodeStartOffset)
throws IOException {
int chunkGroupHeaderSize =
new
ChunkGroupHeader(deviceIsAlignedPair.getLeft()).getSerializedSize();
if (deviceIsAlignedPair.getRight()) {
- TimeseriesMetadata timeColumnTimeseriesMetadata =
- reader.getTimeColumnMetadata(
- firstMeasurementNodeOfCurrentDevice,
timeSeriesMetadataIoSizeRecorder);
- IChunkMetadata iChunkMetadata =
timeColumnTimeseriesMetadata.getChunkMetadataList().get(0);
- return iChunkMetadata.getOffsetOfChunkHeader() - chunkGroupHeaderSize;
+ Pair<Long, Long> timeseriesMetadataOffsetPair =
+ getTimeColumnMetadataOffset(reader,
firstMeasurementNodeOfCurrentDevice);
+ IChunkMetadata firstChunkMetadata =
+ reader
+ .getChunkMetadataListByTimeseriesMetadataOffset(
+ timeseriesMetadataOffsetPair.getLeft(),
timeseriesMetadataOffsetPair.getRight())
+ .get(0);
+ return new Offsets(
+ firstChunkMetadata.getOffsetOfChunkHeader() - chunkGroupHeaderSize,
+ timeseriesMetadataOffsetPair.getLeft(),
+ rootMeasurementNodeStartOffset);
} else {
- List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
- reader.getDeviceTimeseriesMetadata(
- timeseriesMetadataList,
- firstMeasurementNodeOfCurrentDevice,
- Collections.emptySet(),
- true,
- timeSeriesMetadataIoSizeRecorder);
- long minOffset = Long.MAX_VALUE;
- for (TimeseriesMetadata timeseriesMetadata : timeseriesMetadataList) {
- for (IChunkMetadata chunkMetadata :
timeseriesMetadata.getChunkMetadataList()) {
- minOffset = Math.min(minOffset,
chunkMetadata.getOffsetOfChunkHeader());
+ Map<String, Pair<List<IChunkMetadata>, Pair<Long, Long>>>
timeseriesMetadataOffsetByDevice =
+ reader.getTimeseriesMetadataOffsetByDevice(
+ firstMeasurementNodeOfCurrentDevice, Collections.emptySet(),
true);
+ long minTimeseriesMetadataOffset = 0;
+ long minChunkOffset = Long.MAX_VALUE;
+ for (Map.Entry<String, Pair<List<IChunkMetadata>, Pair<Long, Long>>>
entry :
+ timeseriesMetadataOffsetByDevice.entrySet()) {
+ minTimeseriesMetadataOffset =
+ minTimeseriesMetadataOffset == 0
+ ? entry.getValue().getRight().getLeft()
+ : minTimeseriesMetadataOffset;
+ for (IChunkMetadata chunkMetadata : entry.getValue().getLeft()) {
+ minChunkOffset = Math.min(minChunkOffset,
chunkMetadata.getOffsetOfChunkHeader());
break;
}
}
- return minOffset - chunkGroupHeaderSize;
+ return new Offsets(
+ minChunkOffset - chunkGroupHeaderSize,
+ minTimeseriesMetadataOffset,
+ rootMeasurementNodeStartOffset);
+ }
+ }
+
+ private Pair<Long, Long> getTimeColumnMetadataOffset(
+ TsFileSequenceReader reader, MetadataIndexNode measurementNode) throws
IOException {
+ if (measurementNode.isDeviceLevel()) {
+ throw new IllegalArgumentException("device level metadata index node is
not supported");
+ }
+ List<IMetadataIndexEntry> children = measurementNode.getChildren();
+ long startOffset = children.get(0).getOffset();
+ long endOffset =
+ children.size() > 1 ? children.get(1).getOffset() :
measurementNode.getEndOffset();
+ if
(measurementNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
+ return new Pair<>(startOffset, endOffset);
+ } else {
+ MetadataIndexNode metadataIndexNode =
+ reader.readMetadataIndexNode(
+ startOffset, endOffset, false, timeSeriesMetadataIoSizeRecorder);
+ return getTimeColumnMetadataOffset(reader, metadataIndexNode);
}
}
@@ -170,4 +206,35 @@ public abstract class DiskUsageStatisticUtil implements
Closeable {
public void close() throws IOException {
releaseReadLocks();
}
+
+ protected static class Offsets {
+ protected final long firstChunkOffset;
+ protected final long firstTimeseriesMetadataOffset;
+ protected final long firstMeasurementNodeOffset;
+
+ public Offsets(
+ long firstChunkOffset,
+ long firstTimeseriesMetadataOffset,
+ long firstMeasurementNodeOffset) {
+ this.firstChunkOffset = firstChunkOffset;
+ this.firstTimeseriesMetadataOffset = firstTimeseriesMetadataOffset;
+ this.firstMeasurementNodeOffset = firstMeasurementNodeOffset;
+ }
+
+ protected long minusOffsetForTableModel(Offsets other) {
+ return firstChunkOffset
+ - other.firstChunkOffset
+ + firstTimeseriesMetadataOffset
+ - other.firstTimeseriesMetadataOffset
+ + firstMeasurementNodeOffset
+ - other.firstMeasurementNodeOffset;
+ }
+
+ protected long minusOffsetForTreeModel(Offsets other) {
+ return firstChunkOffset
+ - other.firstChunkOffset
+ + firstTimeseriesMetadataOffset
+ - other.firstTimeseriesMetadataOffset;
+ }
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageStatisticUtil.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageStatisticUtil.java
index 99c1cf227ae..f1236c1673e 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageStatisticUtil.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageStatisticUtil.java
@@ -23,7 +23,6 @@ import
org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContex
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
-import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.MetadataIndexNode;
import org.apache.tsfile.file.metadata.TsFileMetadata;
@@ -43,18 +42,21 @@ public class TableDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
public static final long SHALLOW_SIZE =
RamUsageEstimator.shallowSizeOfInstance(TableDiskUsageStatisticUtil.class);
private final Map<String, Integer> tableIndexMap;
+ private final boolean databaseHasOnlyOneTable;
private final long[] resultArr;
public TableDiskUsageStatisticUtil(
TsFileManager tsFileManager,
long timePartition,
List<String> tableNames,
+ boolean databaseHasOnlyOneTable,
Optional<FragmentInstanceContext> context) {
super(tsFileManager, timePartition, context);
this.tableIndexMap = new HashMap<>();
for (int i = 0; i < tableNames.size(); i++) {
tableIndexMap.put(tableNames.get(i), i);
}
+ this.databaseHasOnlyOneTable = databaseHasOnlyOneTable;
this.resultArr = new long[tableNames.size()];
}
@@ -63,6 +65,15 @@ public class TableDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
return resultArr;
}
+ @Override
+ protected boolean calculateWithoutOpenFile(TsFileResource tsFileResource) {
+ if (!databaseHasOnlyOneTable || tsFileResource.anyModFileExists()) {
+ return false;
+ }
+ resultArr[0] += tsFileResource.getTsFileSize();
+ return true;
+ }
+
@Override
protected void calculateNextFile(TsFileResource tsFileResource,
TsFileSequenceReader reader)
throws IOException {
@@ -70,16 +81,14 @@ public class TableDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
if (!hasSatisfiedData(tsFileMetadata)) {
return;
}
- int allSatisfiedTableIndex = getAllSatisfiedTableIndex(tsFileMetadata);
- if (allSatisfiedTableIndex > 0) {
- // size of tsfile - size of (tsfile magic string + version number + all
metadata + metadata
- // marker)
+ Pair<Integer, Boolean> allSatisfiedTableIndexPair =
getAllSatisfiedTableIndex(tsFileMetadata);
+ int allSatisfiedTableIndex = allSatisfiedTableIndexPair.getLeft();
+ // the only one table in this tsfile might be deleted by mods, and it is
not the table we
+ // queried
+ boolean mayContainSearchedTable = allSatisfiedTableIndexPair.getRight();
+ if (allSatisfiedTableIndex != -1) {
resultArr[allSatisfiedTableIndex] +=
- (tsFileResource.getTsFileSize()
- - reader.getAllMetadataSize()
- - 1
- - TSFileConfig.MAGIC_STRING.getBytes().length
- - 1);
+ mayContainSearchedTable ? tsFileResource.getTsFileSize() : 0;
return;
}
calculateDiskUsageInBytesByOffset(reader);
@@ -91,13 +100,15 @@ public class TableDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
return
tableIndexMap.keySet().stream().anyMatch(tableMetadataIndexNodeMap::containsKey);
}
- private int getAllSatisfiedTableIndex(TsFileMetadata tsFileMetadata) {
+ private Pair<Integer, Boolean> getAllSatisfiedTableIndex(TsFileMetadata
tsFileMetadata) {
if (tsFileMetadata.getTableMetadataIndexNodeMap().size() != 1) {
- return -1;
+ return new Pair<>(-1, true);
}
String satisfiedTableName =
tsFileMetadata.getTableMetadataIndexNodeMap().keySet().iterator().next();
- return tableIndexMap.get(satisfiedTableName);
+ String searchedTableName = tableIndexMap.keySet().iterator().next();
+ return new Pair<>(
+ tableIndexMap.get(satisfiedTableName),
satisfiedTableName.equals(searchedTableName));
}
private void calculateDiskUsageInBytesByOffset(TsFileSequenceReader reader)
throws IOException {
@@ -106,7 +117,7 @@ public class TableDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
tsFileMetadata.getTableMetadataIndexNodeMap();
String nextTable = null;
Iterator<String> iterator = tableMetadataIndexNodeMap.keySet().iterator();
- Map<String, Long> tableOffsetMap = new HashMap<>();
+ Map<String, Offsets> tableOffsetMap = new HashMap<>();
while (iterator.hasNext()) {
String currentTable = iterator.next();
while (currentTable != null && tableIndexMap.containsKey(currentTable)) {
@@ -120,23 +131,42 @@ public class TableDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
}
private long calculateTableSize(
- Map<String, Long> tableOffsetMap,
+ Map<String, Offsets> tableOffsetMap,
TsFileMetadata tsFileMetadata,
TsFileSequenceReader reader,
String tableName,
- String nextTable) {
- long startOffset, endOffset;
+ String nextTable)
+ throws IOException {
+ Offsets startOffset = getTableOffset(tableOffsetMap, reader, tableName);
+ Offsets endOffset;
if (nextTable == null) {
- endOffset = tsFileMetadata.getMetaOffset();
+ long firstMeasurementNodeOffsetOfFirstTable;
+ String firstTableName =
+
tsFileMetadata.getTableMetadataIndexNodeMap().keySet().iterator().next();
+ Offsets firstTableOffset = tableOffsetMap.get(firstTableName);
+ if (firstTableOffset != null) {
+ firstMeasurementNodeOffsetOfFirstTable =
firstTableOffset.firstMeasurementNodeOffset;
+ } else {
+ TsFileDeviceIterator deviceIterator =
+ reader.getTableDevicesIteratorWithIsAligned(
+ tableName, timeSeriesMetadataIoSizeRecorder);
+ deviceIterator.next();
+ firstMeasurementNodeOffsetOfFirstTable =
+ deviceIterator.getCurrentDeviceMeasurementNodeOffset()[0];
+ }
+ endOffset =
+ new Offsets(
+ tsFileMetadata.getMetaOffset(),
+ firstMeasurementNodeOffsetOfFirstTable,
+ reader.getFileMetadataPos());
} else {
endOffset = getTableOffset(tableOffsetMap, reader, nextTable);
}
- startOffset = getTableOffset(tableOffsetMap, reader, tableName);
- return endOffset - startOffset;
+ return endOffset.minusOffsetForTableModel(startOffset);
}
- private long getTableOffset(
- Map<String, Long> tableOffsetMap, TsFileSequenceReader reader, String
tableName) {
+ private Offsets getTableOffset(
+ Map<String, Offsets> tableOffsetMap, TsFileSequenceReader reader, String
tableName) {
return tableOffsetMap.computeIfAbsent(
tableName,
k -> {
@@ -144,8 +174,11 @@ public class TableDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
TsFileDeviceIterator deviceIterator =
reader.getTableDevicesIteratorWithIsAligned(k,
timeSeriesMetadataIoSizeRecorder);
Pair<IDeviceID, Boolean> pair = deviceIterator.next();
- return calculateStartOffsetOfChunkGroup(
- reader,
deviceIterator.getFirstMeasurementNodeOfCurrentDevice(), pair);
+ return calculateStartOffsetOfChunkGroupAndTimeseriesMetadata(
+ reader,
+ deviceIterator.getFirstMeasurementNodeOfCurrentDevice(),
+ pair,
+ deviceIterator.getCurrentDeviceMeasurementNodeOffset()[0]);
} catch (IOException e) {
throw new RuntimeException(e);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TreeDiskUsageStatisticUtil.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TreeDiskUsageStatisticUtil.java
index ae1c47b03e0..5d6f2aaed5e 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TreeDiskUsageStatisticUtil.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TreeDiskUsageStatisticUtil.java
@@ -29,7 +29,7 @@ import
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.MetadataIndexNode;
-import org.apache.tsfile.read.TsFileDeviceIterator;
+import org.apache.tsfile.read.LazyTsFileDeviceIterator;
import org.apache.tsfile.read.TsFileSequenceReader;
import org.apache.tsfile.utils.Pair;
import org.apache.tsfile.utils.RamUsageEstimator;
@@ -75,58 +75,84 @@ public class TreeDiskUsageStatisticUtil extends
DiskUsageStatisticUtil {
return new long[] {result};
}
+ @Override
+ protected boolean calculateWithoutOpenFile(TsFileResource tsFileResource) {
+ return false;
+ }
+
@Override
protected void calculateNextFile(TsFileResource tsFileResource,
TsFileSequenceReader reader)
throws IOException, IllegalPathException {
- TsFileDeviceIterator deviceIterator =
reader.getAllDevicesIteratorWithIsAligned();
+ long firstDeviceMeasurementNodeOffset = -1;
+ LazyTsFileDeviceIterator deviceIterator = reader.getLazyDeviceIterator();
while (deviceIterator.hasNext()) {
- Pair<IDeviceID, Boolean> deviceIsAlignedPair = deviceIterator.next();
- if (!matchPathPattern(deviceIsAlignedPair.getLeft())) {
+ IDeviceID deviceIsAlignedPair = deviceIterator.next();
+ firstDeviceMeasurementNodeOffset =
+ firstDeviceMeasurementNodeOffset == -1
+ ? deviceIterator.getCurrentDeviceMeasurementNodeOffset()[0]
+ : firstDeviceMeasurementNodeOffset;
+ if (!matchPathPattern(deviceIsAlignedPair)) {
continue;
}
MetadataIndexNode nodeOfFirstMatchedDevice =
deviceIterator.getFirstMeasurementNodeOfCurrentDevice();
- Pair<IDeviceID, Boolean> nextNotMatchedDevice = null;
+ addMeasurementNodeSizeForCurrentDevice(deviceIterator);
+ IDeviceID nextNotMatchedDevice = null;
MetadataIndexNode nodeOfNextNotMatchedDevice = null;
while (deviceIterator.hasNext()) {
- Pair<IDeviceID, Boolean> currentDevice = deviceIterator.next();
- if (!matchPathPattern(currentDevice.getLeft())) {
+ IDeviceID currentDevice = deviceIterator.next();
+ if (!matchPathPattern(currentDevice)) {
nextNotMatchedDevice = currentDevice;
nodeOfNextNotMatchedDevice =
deviceIterator.getFirstMeasurementNodeOfCurrentDevice();
break;
}
+ addMeasurementNodeSizeForCurrentDevice(deviceIterator);
}
result +=
calculatePathPatternSize(
reader,
- deviceIsAlignedPair,
+ new Pair<>(deviceIsAlignedPair,
reader.isAlignedDevice(nodeOfFirstMatchedDevice)),
nodeOfFirstMatchedDevice,
- nextNotMatchedDevice,
- nodeOfNextNotMatchedDevice);
+ nodeOfNextNotMatchedDevice == null
+ ? null
+ : new Pair<>(
+ nextNotMatchedDevice,
reader.isAlignedDevice(nodeOfNextNotMatchedDevice)),
+ nodeOfNextNotMatchedDevice,
+ firstDeviceMeasurementNodeOffset);
if (isMatchedDeviceSequential) {
break;
}
}
}
+ private void addMeasurementNodeSizeForCurrentDevice(LazyTsFileDeviceIterator
iterator) {
+ long[] startEndPair = iterator.getCurrentDeviceMeasurementNodeOffset();
+ result += startEndPair[1] - startEndPair[0];
+ }
+
private long calculatePathPatternSize(
TsFileSequenceReader reader,
Pair<IDeviceID, Boolean> firstMatchedDevice,
MetadataIndexNode nodeOfFirstMatchedDevice,
Pair<IDeviceID, Boolean> nextNotMatchedDevice,
- MetadataIndexNode nodeOfNextNotMatchedDevice)
+ MetadataIndexNode nodeOfNextNotMatchedDevice,
+ long firstDeviceMeasurementNodeOffset)
throws IOException {
- long startOffset, endOffset;
+ Offsets chunkGroupTimeseriesMetadataStartOffsetPair,
chunkGroupTimeseriesMetadataEndOffsetPair;
if (nextNotMatchedDevice == null) {
- endOffset = reader.readFileMetadata().getMetaOffset();
+ chunkGroupTimeseriesMetadataEndOffsetPair =
+ new Offsets(
+ reader.readFileMetadata().getMetaOffset(),
firstDeviceMeasurementNodeOffset, 0);
} else {
- endOffset =
- calculateStartOffsetOfChunkGroup(
- reader, nodeOfNextNotMatchedDevice, nextNotMatchedDevice);
+ chunkGroupTimeseriesMetadataEndOffsetPair =
+ calculateStartOffsetOfChunkGroupAndTimeseriesMetadata(
+ reader, nodeOfNextNotMatchedDevice, nextNotMatchedDevice, 0);
}
- startOffset =
- calculateStartOffsetOfChunkGroup(reader, nodeOfFirstMatchedDevice,
firstMatchedDevice);
- return endOffset - startOffset;
+ chunkGroupTimeseriesMetadataStartOffsetPair =
+ calculateStartOffsetOfChunkGroupAndTimeseriesMetadata(
+ reader, nodeOfFirstMatchedDevice, firstMatchedDevice, 0);
+ return chunkGroupTimeseriesMetadataEndOffsetPair.minusOffsetForTreeModel(
+ chunkGroupTimeseriesMetadataStartOffsetPair);
}
private boolean matchPathPattern(IDeviceID deviceID) throws
IllegalPathException {