This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch tsFile_v4
in repository https://gitbox.apache.org/repos/asf/tsfile.git
The following commit(s) were added to refs/heads/tsFile_v4 by this push:
new a4e57f98 fix TsFileSequenceReader
a4e57f98 is described below
commit a4e57f98bbb10380973042d1364e3e25ac70a1ba
Author: jt2594838 <[email protected]>
AuthorDate: Sun Apr 7 16:21:39 2024 +0800
fix TsFileSequenceReader
---
.../tsfile/file/metadata/TsFileMetadata.java | 8 ++
.../apache/tsfile/read/TsFileSequenceReader.java | 132 ++++++++++++---------
...leSequenceReaderTimeseriesMetadataIterator.java | 20 ++--
.../tsfile/file/metadata/utils/TestHelper.java | 6 +-
4 files changed, 103 insertions(+), 63 deletions(-)
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
index 5cec83ef..eb311766 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
@@ -160,4 +160,12 @@ public class TsFileMetadata {
public void setTableSchemaMap(Map<String, TableSchema> tableSchemaMap) {
this.tableSchemaMap = tableSchemaMap;
}
+
+ public Map<String, MetadataIndexNode> getTableMetadataIndexNodeMap() {
+ return tableMetadataIndexNodeMap;
+ }
+
+ public Map<String, TableSchema> getTableSchemaMap() {
+ return tableSchemaMap;
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
index a15c9890..fb50e186 100644
--- a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
+++ b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
@@ -85,6 +85,7 @@ import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Queue;
@@ -376,7 +377,8 @@ public class TsFileSequenceReader implements AutoCloseable {
public TimeseriesMetadata readTimeseriesMetadata(
IDeviceID device, String measurement, boolean ignoreNotExists) throws
IOException {
readFileMetadata();
- MetadataIndexNode deviceMetadataIndexNode =
tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode deviceMetadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device,
true);
if (metadataIndexPair == null) {
@@ -436,7 +438,8 @@ public class TsFileSequenceReader implements AutoCloseable {
public ITimeSeriesMetadata readITimeseriesMetadata(Path path, boolean
ignoreNotExists)
throws IOException {
readFileMetadata();
- MetadataIndexNode deviceMetadataIndexNode =
tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode deviceMetadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(path.getIDeviceID().getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode,
path.getIDeviceID(), true);
if (metadataIndexPair == null) {
@@ -543,7 +546,8 @@ public class TsFileSequenceReader implements AutoCloseable {
private Pair<IMetadataIndexEntry, Long> getLeafMetadataIndexPair(
IDeviceID device, String measurement) throws IOException {
readFileMetadata();
- MetadataIndexNode deviceMetadataIndexNode =
tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode deviceMetadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device,
true);
if (metadataIndexPair == null) {
@@ -568,7 +572,8 @@ public class TsFileSequenceReader implements AutoCloseable {
public List<ITimeSeriesMetadata> readITimeseriesMetadata(
IDeviceID device, Set<String> measurements) throws IOException {
readFileMetadata();
- MetadataIndexNode deviceMetadataIndexNode =
tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode deviceMetadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device,
false);
if (metadataIndexPair == null) {
@@ -669,7 +674,12 @@ public class TsFileSequenceReader implements AutoCloseable
{
if (tsFileMetaData == null) {
readFileMetadata();
}
- return getAllDevices(tsFileMetaData.getMetadataIndex());
+ List<IDeviceID> deviceIDS = new ArrayList<>();
+ for (Entry<String, MetadataIndexNode> entry :
+ tsFileMetaData.getTableMetadataIndexNodeMap().entrySet()) {
+ deviceIDS.addAll(getAllDevices(entry.getValue()));
+ }
+ return deviceIDS;
}
private List<IDeviceID> getAllDevices(MetadataIndexNode metadataIndexNode)
throws IOException {
@@ -705,15 +715,16 @@ public class TsFileSequenceReader implements
AutoCloseable {
readFileMetadata();
Queue<Pair<IDeviceID, long[]>> queue = new LinkedList<>();
List<long[]> leafDeviceNodeOffsets = new ArrayList<>();
- MetadataIndexNode metadataIndexNode = tsFileMetaData.getMetadataIndex();
- if
(metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_DEVICE)) {
- // the first node of index tree is device leaf node, then get the
devices directly
- getDevicesOfLeafNode(metadataIndexNode, queue);
- } else {
- // get all device leaf node offset
- getAllDeviceLeafNodeOffset(metadataIndexNode, leafDeviceNodeOffsets);
+ for (MetadataIndexNode metadataIndexNode :
+ tsFileMetaData.getTableMetadataIndexNodeMap().values()) {
+ if
(metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_DEVICE)) {
+ // the first node of index tree is device leaf node, then get the
devices directly
+ getDevicesOfLeafNode(metadataIndexNode, queue);
+ } else {
+ // get all device leaf node offset
+ getAllDeviceLeafNodeOffset(metadataIndexNode, leafDeviceNodeOffsets);
+ }
}
-
return new TsFileDeviceIterator(this, leafDeviceNodeOffsets, queue);
}
@@ -859,17 +870,19 @@ public class TsFileSequenceReader implements
AutoCloseable {
public Iterator<List<Path>> getPathsIterator() throws IOException {
readFileMetadata();
- MetadataIndexNode metadataIndexNode = tsFileMetaData.getMetadataIndex();
- List<IMetadataIndexEntry> metadataIndexEntryList =
metadataIndexNode.getChildren();
Queue<Pair<IDeviceID, Pair<Long, Long>>> queue = new LinkedList<>();
- for (int i = 0; i < metadataIndexEntryList.size(); i++) {
- IMetadataIndexEntry metadataIndexEntry = metadataIndexEntryList.get(i);
- long endOffset = metadataIndexNode.getEndOffset();
- if (i != metadataIndexEntryList.size() - 1) {
- endOffset = metadataIndexEntryList.get(i + 1).getOffset();
+ for (MetadataIndexNode metadataIndexNode :
+ tsFileMetaData.getTableMetadataIndexNodeMap().values()) {
+ List<IMetadataIndexEntry> metadataIndexEntryList =
metadataIndexNode.getChildren();
+ for (int i = 0; i < metadataIndexEntryList.size(); i++) {
+ IMetadataIndexEntry metadataIndexEntry = metadataIndexEntryList.get(i);
+ long endOffset = metadataIndexNode.getEndOffset();
+ if (i != metadataIndexEntryList.size() - 1) {
+ endOffset = metadataIndexEntryList.get(i + 1).getOffset();
+ }
+ ByteBuffer buffer = readData(metadataIndexEntry.getOffset(),
endOffset);
+ getAllPaths(metadataIndexEntry, buffer, null,
metadataIndexNode.getNodeType(), queue);
}
- ByteBuffer buffer = readData(metadataIndexEntry.getOffset(), endOffset);
- getAllPaths(metadataIndexEntry, buffer, null,
metadataIndexNode.getNodeType(), queue);
}
return new Iterator<List<Path>>() {
@Override
@@ -1229,41 +1242,45 @@ public class TsFileSequenceReader implements
AutoCloseable {
readFileMetadata();
}
Map<IDeviceID, List<TimeseriesMetadata>> timeseriesMetadataMap = new
HashMap<>();
- MetadataIndexNode metadataIndexNode = tsFileMetaData.getMetadataIndex();
- List<IMetadataIndexEntry> metadataIndexEntryList =
metadataIndexNode.getChildren();
- for (int i = 0; i < metadataIndexEntryList.size(); i++) {
- IMetadataIndexEntry metadataIndexEntry = metadataIndexEntryList.get(i);
- long endOffset = metadataIndexNode.getEndOffset();
- if (i != metadataIndexEntryList.size() - 1) {
- endOffset = metadataIndexEntryList.get(i + 1).getOffset();
- }
- if (endOffset - metadataIndexEntry.getOffset() < Integer.MAX_VALUE) {
- ByteBuffer buffer = readData(metadataIndexEntry.getOffset(),
endOffset);
- generateMetadataIndex(
- metadataIndexEntry,
- buffer,
- null,
- metadataIndexNode.getNodeType(),
- timeseriesMetadataMap,
- needChunkMetadata);
- } else {
- generateMetadataIndexUsingTsFileInput(
- metadataIndexNode.getChildren().get(i),
- metadataIndexNode.getChildren().get(i).getOffset(),
- endOffset,
- null,
- metadataIndexNode.getNodeType(),
- timeseriesMetadataMap,
- needChunkMetadata);
+ for (MetadataIndexNode metadataIndexNode :
+ tsFileMetaData.getTableMetadataIndexNodeMap().values()) {
+ List<IMetadataIndexEntry> metadataIndexEntryList =
metadataIndexNode.getChildren();
+ for (int i = 0; i < metadataIndexEntryList.size(); i++) {
+ IMetadataIndexEntry metadataIndexEntry = metadataIndexEntryList.get(i);
+ long endOffset = metadataIndexNode.getEndOffset();
+ if (i != metadataIndexEntryList.size() - 1) {
+ endOffset = metadataIndexEntryList.get(i + 1).getOffset();
+ }
+ if (endOffset - metadataIndexEntry.getOffset() < Integer.MAX_VALUE) {
+ ByteBuffer buffer = readData(metadataIndexEntry.getOffset(),
endOffset);
+ generateMetadataIndex(
+ metadataIndexEntry,
+ buffer,
+ null,
+ metadataIndexNode.getNodeType(),
+ timeseriesMetadataMap,
+ needChunkMetadata);
+ } else {
+ generateMetadataIndexUsingTsFileInput(
+ metadataIndexNode.getChildren().get(i),
+ metadataIndexNode.getChildren().get(i).getOffset(),
+ endOffset,
+ null,
+ metadataIndexNode.getNodeType(),
+ timeseriesMetadataMap,
+ needChunkMetadata);
+ }
}
}
+
return timeseriesMetadataMap;
}
/* This method will only deserialize the TimeseriesMetadata, not including
chunk metadata list */
private List<TimeseriesMetadata>
getDeviceTimeseriesMetadataWithoutChunkMetadata(IDeviceID device)
throws IOException {
- MetadataIndexNode metadataIndexNode = tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode metadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(metadataIndexNode, device, true);
if (metadataIndexPair == null) {
@@ -1288,7 +1305,8 @@ public class TsFileSequenceReader implements
AutoCloseable {
/* This method will not only deserialize the TimeseriesMetadata, but also
all the chunk metadata list meanwhile. */
private List<TimeseriesMetadata> getDeviceTimeseriesMetadata(IDeviceID
device)
throws IOException {
- MetadataIndexNode metadataIndexNode = tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode metadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(metadataIndexNode, device, true);
if (metadataIndexPair == null) {
@@ -1901,7 +1919,13 @@ public class TsFileSequenceReader implements
AutoCloseable {
}
}
currentChunk =
- new ChunkMetadata(measurementID, dataType, fileOffsetOfChunk,
chunkStatistics);
+ new ChunkMetadata(
+ measurementID,
+ dataType,
+ chunkHeader.getEncodingType(),
+ chunkHeader.getCompressionType(),
+ fileOffsetOfChunk,
+ chunkStatistics);
chunkMetadataList.add(currentChunk);
break;
case MetaMarker.CHUNK_GROUP_HEADER:
@@ -2157,7 +2181,8 @@ public class TsFileSequenceReader implements
AutoCloseable {
*/
public List<AlignedChunkMetadata> getAlignedChunkMetadata(IDeviceID device)
throws IOException {
readFileMetadata();
- MetadataIndexNode deviceMetadataIndexNode =
tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode deviceMetadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device,
true);
if (metadataIndexPair == null) {
@@ -2388,7 +2413,8 @@ public class TsFileSequenceReader implements
AutoCloseable {
IDeviceID device) throws IOException {
readFileMetadata();
- MetadataIndexNode metadataIndexNode = tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode metadataIndexNode =
+
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(metadataIndexNode, device, true);
diff --git
a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
index 2fc83d95..ec2ca203 100644
---
a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
+++
b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
@@ -62,15 +62,17 @@ public class TsFileSequenceReaderTimeseriesMetadataIterator
this.reader.readFileMetadata();
}
- final MetadataIndexNode metadataIndexNode =
reader.tsFileMetaData.getMetadataIndex();
- long curEntryEndOffset = metadataIndexNode.getEndOffset();
- List<IMetadataIndexEntry> metadataIndexEntryList =
metadataIndexNode.getChildren();
-
- for (int i = metadataIndexEntryList.size() - 1; i >= 0; i--) {
- metadataIndexEntryStack.push(
- new MetadataIndexEntryInfo(
- metadataIndexEntryList.get(i), metadataIndexNode.getNodeType(),
curEntryEndOffset));
- curEntryEndOffset = metadataIndexEntryList.get(i).getOffset();
+ for (MetadataIndexNode metadataIndexNode :
+ reader.tsFileMetaData.getTableMetadataIndexNodeMap().values()) {
+ long curEntryEndOffset = metadataIndexNode.getEndOffset();
+ List<IMetadataIndexEntry> metadataIndexEntryList =
metadataIndexNode.getChildren();
+
+ for (int i = metadataIndexEntryList.size() - 1; i >= 0; i--) {
+ metadataIndexEntryStack.push(
+ new MetadataIndexEntryInfo(
+ metadataIndexEntryList.get(i),
metadataIndexNode.getNodeType(), curEntryEndOffset));
+ curEntryEndOffset = metadataIndexEntryList.get(i).getOffset();
+ }
}
}
diff --git
a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java
b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java
index 65eec6ab..db43abcb 100644
--- a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java
+++ b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java
@@ -33,12 +33,16 @@ import org.apache.tsfile.write.schema.MeasurementSchema;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Collections;
public class TestHelper {
+ public static final String TEST_TABLE_NAME = "test_table";
+
public static TsFileMetadata createSimpleFileMetaData() {
TsFileMetadata metaData = new TsFileMetadata();
- metaData.setMetadataIndex(generateMetaDataIndex());
+ metaData.setTableMetadataIndexNodeMap(
+ Collections.singletonMap(TEST_TABLE_NAME, generateMetaDataIndex()));
return metaData;
}