in java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java [541:611]
public TimeseriesMetadata readTimeseriesMetadata(
IDeviceID device,
String measurement,
boolean ignoreNotExistDevice,
LongConsumer ioSizeConsumer)
throws IOException {
readFileMetadata(ioSizeConsumer);
MetadataIndexNode deviceMetadataIndexNode =
tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
Pair<IMetadataIndexEntry, Long> metadataIndexPair =
getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device, true, ioSizeConsumer);
if (metadataIndexPair == null) {
if (ignoreNotExistDevice) {
return null;
}
throw new IOException("Device {" + device + "} is not in tsFileMetaData of " + file);
}
ByteBuffer buffer =
readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right, ioSizeConsumer);
MetadataIndexNode metadataIndexNode = deviceMetadataIndexNode;
if (!metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
try {
metadataIndexNode =
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
buffer, deserializeConfig);
} catch (Exception e) {
logger.error(METADATA_INDEX_NODE_DESERIALIZE_ERROR, file);
throw e;
}
metadataIndexPair =
getMetadataAndEndOffsetOfMeasurementNode(
metadataIndexNode, measurement, false, ioSizeConsumer);
}
if (metadataIndexPair == null) {
return null;
}
List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
if (metadataIndexPair.right - metadataIndexPair.left.getOffset() < Integer.MAX_VALUE) {
buffer =
readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right, ioSizeConsumer);
while (buffer.hasRemaining()) {
try {
timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
} catch (Exception e) {
logger.error(
"Something error happened while deserializing TimeseriesMetadata of file {}", file);
throw e;
}
}
} else {
if (ioSizeConsumer != null) {
ioSizeConsumer.accept(metadataIndexPair.right - metadataIndexPair.left.getOffset());
}
// when the buffer length is over than Integer.MAX_VALUE,
// using tsFileInput to get timeseriesMetadataList
tsFileInput.position(metadataIndexPair.left.getOffset());
while (tsFileInput.position() < metadataIndexPair.right) {
try {
timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(tsFileInput, true));
} catch (Exception e1) {
logger.error(
"Something error happened while deserializing TimeseriesMetadata of file {}", file);
throw e1;
}
}
}
// return null if path does not exist in the TsFile
int searchResult = binarySearchInTimeseriesMetadataList(timeseriesMetadataList, measurement);
return searchResult >= 0 ? timeseriesMetadataList.get(searchResult) : null;
}