You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xu...@apache.org on 2022/01/15 04:03:59 UTC

[iotdb] branch remove_stat_xkf created (now 6f5e91d)

This is an automated email from the ASF dual-hosted git repository.

xuekaifeng pushed a change to branch remove_stat_xkf
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


      at 6f5e91d  fix test

This branch includes the following new commits:

     new 87c1ca1  init
     new 6f5e91d  fix test

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[iotdb] 02/02: fix test

Posted by xu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xuekaifeng pushed a commit to branch remove_stat_xkf
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 6f5e91d3dcaa057089037301159321844b9e111f
Author: 151250176 <15...@smail.nju.edu.cn>
AuthorDate: Sat Jan 15 12:02:27 2022 +0800

    fix test
---
 .../tsfile/write/MetadataIndexConstructorTest.java | 35 ++++++++++------------
 1 file changed, 16 insertions(+), 19 deletions(-)

diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/MetadataIndexConstructorTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/MetadataIndexConstructorTest.java
index 5e518d4..0fff602 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/MetadataIndexConstructorTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/MetadataIndexConstructorTest.java
@@ -18,10 +18,23 @@
  */
 package org.apache.iotdb.tsfile.write;
 
+import static org.apache.iotdb.tsfile.utils.FileGenerator.generateIndexString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
-import org.apache.iotdb.tsfile.constant.TestConstant;
 import org.apache.iotdb.tsfile.file.metadata.MetadataIndexEntry;
 import org.apache.iotdb.tsfile.file.metadata.MetadataIndexNode;
 import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
@@ -34,40 +47,24 @@ import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.utils.MeasurementGroup;
 import org.apache.iotdb.tsfile.utils.Pair;
+import org.apache.iotdb.tsfile.utils.TsFileGeneratorForTest;
 import org.apache.iotdb.tsfile.write.record.TSRecord;
 import org.apache.iotdb.tsfile.write.record.Tablet;
 import org.apache.iotdb.tsfile.write.record.datapoint.DataPoint;
 import org.apache.iotdb.tsfile.write.record.datapoint.LongDataPoint;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.apache.iotdb.tsfile.write.schema.Schema;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.iotdb.tsfile.utils.FileGenerator.generateIndexString;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 /** test for MetadataIndexConstructor */
 public class MetadataIndexConstructorTest {
   private static final Logger logger = LoggerFactory.getLogger(MetadataIndexConstructorTest.class);
   private final TSFileConfig conf = TSFileDescriptor.getInstance().getConfig();
-  private static final String FILE_PATH =
-      TestConstant.BASE_OUTPUT_PATH.concat("MetadataIndexConstructorTest.tsfile");
+  private static final String FILE_PATH = TsFileGeneratorForTest.outputDataFile;
 
   private static final String measurementPrefix = "sensor_";
   private static final String vectorPrefix = "vector_";

[iotdb] 01/02: init

Posted by xu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xuekaifeng pushed a commit to branch remove_stat_xkf
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 87c1ca13b22818b2657d243032175fac0e9660f8
Author: 151250176 <15...@smail.nju.edu.cn>
AuthorDate: Sat Jan 15 11:56:33 2022 +0800

    init
---
 .../apache/iotdb/db/tools/TsFileSketchTool.java    |  10 +-
 .../iotdb/tsfile/common/conf/TSFileConfig.java     |  11 ++
 .../tsfile/file/metadata/AlignedChunkMetadata.java |  10 ++
 .../iotdb/tsfile/file/metadata/ChunkMetadata.java  |   4 +
 .../iotdb/tsfile/file/metadata/IChunkMetadata.java |   2 +
 .../tsfile/file/metadata/TimeseriesMetadata.java   |  36 ++++--
 .../TimeseriesMetadataStatisticsLoader.java        | 132 +++++++++++++++++++++
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |  21 ++--
 .../file/metadata/TimeseriesMetadataTest.java      |   2 +-
 9 files changed, 205 insertions(+), 23 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/tools/TsFileSketchTool.java b/server/src/main/java/org/apache/iotdb/db/tools/TsFileSketchTool.java
index 947c1b7..2d2be89 100644
--- a/server/src/main/java/org/apache/iotdb/db/tools/TsFileSketchTool.java
+++ b/server/src/main/java/org/apache/iotdb/db/tools/TsFileSketchTool.java
@@ -23,7 +23,13 @@ import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.file.MetaMarker;
 import org.apache.iotdb.tsfile.file.header.ChunkGroupHeader;
 import org.apache.iotdb.tsfile.file.header.PageHeader;
-import org.apache.iotdb.tsfile.file.metadata.*;
+import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetadata;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.MetadataIndexEntry;
+import org.apache.iotdb.tsfile.file.metadata.MetadataIndexNode;
+import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
+import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.MetadataIndexNodeType;
 import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
 import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
@@ -440,7 +446,7 @@ public class TsFileSketchTool {
           while (buffer.hasRemaining()) {
             long pos = startOffset + buffer.position();
             TimeseriesMetadata timeseriesMetadata =
-                TimeseriesMetadata.deserializeFrom(buffer, needChunkMetadata);
+                TimeseriesMetadata.deserializeFrom(buffer, needChunkMetadata, reader);
             timeseriesMetadataMap.put(
                 pos,
                 new Pair<>(
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileConfig.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileConfig.java
index d13f817..02fdff4 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileConfig.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/conf/TSFileConfig.java
@@ -146,6 +146,9 @@ public class TSFileConfig implements Serializable {
   /** The amount of data iterate each time */
   private int batchSize = 1000;
 
+  /** whether we should remove stat */
+  private boolean removeStat = true;
+
   public TSFileConfig() {}
 
   public int getGroupSizeInByte() {
@@ -411,4 +414,12 @@ public class TSFileConfig implements Serializable {
   public void setBatchSize(int batchSize) {
     this.batchSize = batchSize;
   }
+
+  public boolean isRemoveStat() {
+    return removeStat;
+  }
+
+  public void setRemoveStat(boolean removeStat) {
+    this.removeStat = removeStat;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
index a69e61b..353bebc 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.tsfile.read.common.TimeRange;
 import org.apache.iotdb.tsfile.read.controller.IChunkLoader;
 
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.util.List;
 
 public class AlignedChunkMetadata implements IChunkMetadata {
@@ -49,6 +50,15 @@ public class AlignedChunkMetadata implements IChunkMetadata {
         : timeChunkMetadata.getStatistics();
   }
 
+  @Override
+  public void setStatistics(Statistics<? extends Serializable> statistics) {
+    if (valueChunkMetadataList.size() == 1 && valueChunkMetadataList.get(0) != null) {
+      valueChunkMetadataList.get(0).setStatistics(statistics);
+    } else {
+      timeChunkMetadata.setStatistics(statistics);
+    }
+  }
+
   public Statistics getStatistics(int index) {
     IChunkMetadata v = valueChunkMetadataList.get(index);
     return v == null ? null : v.getStatistics();
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
index 831f8cd..01b10d6 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
@@ -336,4 +336,8 @@ public class ChunkMetadata implements IChunkMetadata {
   public void setMask(byte mask) {
     this.mask = mask;
   }
+
+  public void setStatistics(Statistics<? extends Serializable> statistics) {
+    this.statistics = statistics;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
index 1cc819f..88a07a0 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
@@ -33,6 +33,8 @@ public interface IChunkMetadata {
 
   Statistics<? extends Serializable> getStatistics();
 
+  void setStatistics(Statistics<? extends Serializable> statistics);
+
   boolean isModified();
 
   void setModified(boolean modified);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
index 58b26db..8e61ad9 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
@@ -19,19 +19,20 @@
 
 package org.apache.iotdb.tsfile.file.metadata;
 
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
-import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader;
-import org.apache.iotdb.tsfile.utils.PublicBAOS;
-import org.apache.iotdb.tsfile.utils.ReadWriteForEncodingUtils;
-import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
-
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader;
+import org.apache.iotdb.tsfile.utils.PublicBAOS;
+import org.apache.iotdb.tsfile.utils.ReadWriteForEncodingUtils;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 public class TimeseriesMetadata implements ITimeSeriesMetadata {
 
@@ -72,6 +73,8 @@ public class TimeseriesMetadata implements ITimeSeriesMetadata {
 
   private ArrayList<IChunkMetadata> chunkMetadataList;
 
+  private static boolean removeStat = TSFileDescriptor.getInstance().getConfig().isRemoveStat();
+
   public TimeseriesMetadata() {}
 
   public TimeseriesMetadata(
@@ -99,15 +102,18 @@ public class TimeseriesMetadata implements ITimeSeriesMetadata {
     this.chunkMetadataList = new ArrayList<>(timeseriesMetadata.chunkMetadataList);
   }
 
-  public static TimeseriesMetadata deserializeFrom(ByteBuffer buffer, boolean needChunkMetadata) {
+  public static TimeseriesMetadata deserializeFrom(
+      ByteBuffer buffer, boolean needChunkMetadata, TsFileSequenceReader reader) {
     TimeseriesMetadata timeseriesMetaData = new TimeseriesMetadata();
     timeseriesMetaData.setTimeSeriesMetadataType(ReadWriteIOUtils.readByte(buffer));
     timeseriesMetaData.setMeasurementId(ReadWriteIOUtils.readVarIntString(buffer));
     timeseriesMetaData.setTSDataType(ReadWriteIOUtils.readDataType(buffer));
     int chunkMetaDataListDataSize = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
     timeseriesMetaData.setDataSizeOfChunkMetaDataList(chunkMetaDataListDataSize);
-    timeseriesMetaData.setStatistics(Statistics.deserialize(buffer, timeseriesMetaData.dataType));
-    if (needChunkMetadata) {
+    timeseriesMetaData.setStatistics(
+        TimeseriesMetadataStatisticsLoader.getStatistics(timeseriesMetaData, buffer, reader));
+    // loader may already read chunk metadata list
+    if (needChunkMetadata && timeseriesMetaData.getChunkMetadataList() == null) {
       ByteBuffer byteBuffer = buffer.slice();
       byteBuffer.limit(chunkMetaDataListDataSize);
       timeseriesMetaData.chunkMetadataList = new ArrayList<>();
@@ -119,6 +125,7 @@ public class TimeseriesMetadata implements ITimeSeriesMetadata {
       timeseriesMetaData.chunkMetadataList.trimToSize();
     }
     buffer.position(buffer.position() + chunkMetaDataListDataSize);
+
     return timeseriesMetaData;
   }
 
@@ -136,9 +143,16 @@ public class TimeseriesMetadata implements ITimeSeriesMetadata {
     byteLen += ReadWriteIOUtils.write(dataType, outputStream);
     byteLen +=
         ReadWriteForEncodingUtils.writeUnsignedVarInt(chunkMetaDataListDataSize, outputStream);
-    byteLen += statistics.serialize(outputStream);
+
+    // only one chunk and we config remove statistics, we will skip following statistic save
+    // currently aligned timeseries also hold statistics
+    if (!removeStat || timeSeriesMetadataType != 0) {
+      byteLen += statistics.serialize(outputStream);
+    }
+
     chunkMetadataListBuffer.writeTo(outputStream);
     byteLen += chunkMetadataListBuffer.size();
+
     return byteLen;
   }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadataStatisticsLoader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadataStatisticsLoader.java
new file mode 100644
index 0000000..0a3470c
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadataStatisticsLoader.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.tsfile.file.metadata;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+import org.apache.iotdb.tsfile.read.common.Chunk;
+import org.apache.iotdb.tsfile.read.reader.IChunkReader;
+import org.apache.iotdb.tsfile.read.reader.chunk.ChunkReader;
+import org.apache.iotdb.tsfile.utils.Binary;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TimeseriesMetadataStatisticsLoader {
+  private static boolean removeStat = TSFileDescriptor.getInstance().getConfig().isRemoveStat();
+
+  private static final Logger logger =
+      LoggerFactory.getLogger(TimeseriesMetadataStatisticsLoader.class);
+
+  public static Statistics<? extends Serializable> getStatistics(
+      TimeseriesMetadata metadata, ByteBuffer buffer, TsFileSequenceReader reader) {
+    // stat is in buffer, we just deserialize it
+    // currently aligned timeseries also hold statistics
+    if (!removeStat || metadata.getTimeSeriesMetadataType() != 0) {
+      return Statistics.deserialize(buffer, metadata.getTSDataType());
+    }
+
+    // for test
+    if (reader == null) {
+      return Statistics.getStatsByType(metadata.getTSDataType());
+    }
+
+    // load chunk meta data
+    ByteBuffer byteBuffer = buffer.slice();
+    byteBuffer.limit(metadata.getDataSizeOfChunkMetaDataList());
+    ArrayList<ChunkMetadata> chunkMetadataArrayList = new ArrayList<>();
+    while (byteBuffer.hasRemaining()) {
+      chunkMetadataArrayList.add(ChunkMetadata.deserializeFrom(byteBuffer, metadata));
+    }
+    // minimize the storage of an ArrayList instance.
+    chunkMetadataArrayList.trimToSize();
+    metadata.setChunkMetadataList(chunkMetadataArrayList);
+
+    // return null;
+    // we need generate statistic from data
+    IChunkReader chunkReader = null;
+    if ((metadata.getTimeSeriesMetadataType() & 0xc0) > 0) {
+      // aligned
+    }
+
+    Statistics<? extends Serializable> res = Statistics.getStatsByType(metadata.getTSDataType());
+    try {
+
+      // normal series
+      for (IChunkMetadata iChunkMetadata : metadata.getChunkMetadataList()) {
+        ChunkMetadata chunkMetadata = (ChunkMetadata) iChunkMetadata;
+        chunkMetadata.setFilePath(reader.getFileName());
+        Chunk chunk = reader.readMemChunk(chunkMetadata);
+        chunkReader =
+            new ChunkReader(
+                new Chunk(
+                    chunk.getHeader(),
+                    chunk.getData().duplicate(),
+                    chunkMetadata.getDeleteIntervalList(),
+                    chunkMetadata.getStatistics()),
+                null);
+      }
+
+      while (chunkReader.hasNextSatisfiedPage()) {
+        BatchData data = chunkReader.nextPageData();
+        while (data.hasCurrent()) {
+          switch (metadata.getTSDataType()) {
+            case INT32:
+              res.update(data.currentTime(), (int) data.currentValue());
+              break;
+            case INT64:
+              res.update(data.currentTime(), (long) data.currentValue());
+              break;
+            case BOOLEAN:
+              res.update(data.currentTime(), (boolean) data.currentValue());
+              break;
+            case FLOAT:
+              res.update(data.currentTime(), (float) data.currentValue());
+              break;
+            case TEXT:
+              res.update(data.currentTime(), (Binary) data.currentValue());
+              break;
+            case DOUBLE:
+              res.update(data.currentTime(), (Double) data.currentValue());
+              break;
+            case VECTOR:
+              throw new IllegalStateException("shouldn't be vector");
+            default:
+              throw new IllegalArgumentException("unknown type");
+          }
+          data.next();
+        }
+      }
+    } catch (IOException e) {
+      logger.error(e.getMessage());
+    }
+
+    for (IChunkMetadata iChunkMetadata : metadata.getChunkMetadataList()) {
+      iChunkMetadata.setStatistics(res);
+    }
+
+    return res;
+  }
+}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
index d99b3ba..2b29706 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
@@ -362,7 +362,7 @@ public class TsFileSequenceReader implements AutoCloseable {
     buffer = readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right);
     while (buffer.hasRemaining()) {
       try {
-        timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
+        timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true, this));
       } catch (BufferOverflowException e) {
         logger.error(
             "Something error happened while deserializing TimeseriesMetadata of file {}", file);
@@ -409,7 +409,7 @@ public class TsFileSequenceReader implements AutoCloseable {
     buffer = readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right);
     while (buffer.hasRemaining()) {
       try {
-        timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
+        timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true, this));
       } catch (BufferOverflowException e) {
         logger.error(
             "Something error happened while deserializing TimeseriesMetadata of file {}", file);
@@ -445,7 +445,7 @@ public class TsFileSequenceReader implements AutoCloseable {
     while (buffer.hasRemaining()) {
       TimeseriesMetadata timeseriesMetadata;
       try {
-        timeseriesMetadata = TimeseriesMetadata.deserializeFrom(buffer, true);
+        timeseriesMetadata = TimeseriesMetadata.deserializeFrom(buffer, true, this);
       } catch (BufferOverflowException e) {
         logger.error(
             "Something error happened while deserializing TimeseriesMetadata of file {}", file);
@@ -530,7 +530,7 @@ public class TsFileSequenceReader implements AutoCloseable {
               measurementMetadataIndexPair.left.getOffset(), measurementMetadataIndexPair.right);
       while (buffer.hasRemaining()) {
         try {
-          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
+          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true, this));
         } catch (BufferOverflowException e) {
           logger.error(
               "Something error happened while deserializing TimeseriesMetadata of file {}", file);
@@ -735,7 +735,8 @@ public class TsFileSequenceReader implements AutoCloseable {
             paths.add(
                 new Path(
                     startEndPair.left,
-                    TimeseriesMetadata.deserializeFrom(nextBuffer, false).getMeasurementId()));
+                    TimeseriesMetadata.deserializeFrom(nextBuffer, false, TsFileSequenceReader.this)
+                        .getMeasurementId()));
           }
           return paths;
         } catch (IOException e) {
@@ -804,7 +805,7 @@ public class TsFileSequenceReader implements AutoCloseable {
             readData(
                 measurementNode.getChildren().get(0).getOffset(), measurementNode.getEndOffset());
       }
-      return TimeseriesMetadata.deserializeFrom(buffer, true);
+      return TimeseriesMetadata.deserializeFrom(buffer, true, this);
     } else if (measurementNode.getNodeType().equals(MetadataIndexNodeType.INTERNAL_MEASUREMENT)) {
       ByteBuffer buffer =
           readData(
@@ -837,7 +838,8 @@ public class TsFileSequenceReader implements AutoCloseable {
       if (type.equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
         List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
         while (buffer.hasRemaining()) {
-          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, needChunkMetadata));
+          timeseriesMetadataList.add(
+              TimeseriesMetadata.deserializeFrom(buffer, needChunkMetadata, this));
         }
         timeseriesMetadataMap
             .computeIfAbsent(deviceId, k -> new ArrayList<>())
@@ -1475,7 +1477,7 @@ public class TsFileSequenceReader implements AutoCloseable {
       if (metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
         List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
         while (buffer.hasRemaining()) {
-          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
+          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true, this));
         }
         timeseriesMetadataMap
             .computeIfAbsent(device, k -> new ArrayList<>())
@@ -1691,7 +1693,8 @@ public class TsFileSequenceReader implements AutoCloseable {
           List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
           ByteBuffer nextBuffer = readData(startEndPair.left, startEndPair.right);
           while (nextBuffer.hasRemaining()) {
-            timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(nextBuffer, true));
+            timeseriesMetadataList.add(
+                TimeseriesMetadata.deserializeFrom(nextBuffer, true, TsFileSequenceReader.this));
           }
           for (TimeseriesMetadata timeseriesMetadata : timeseriesMetadataList) {
             List<ChunkMetadata> list =
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadataTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadataTest.java
index bee663a..80290a8 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadataTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadataTest.java
@@ -69,7 +69,7 @@ public class TimeseriesMetadataTest {
       ByteBuffer buffer = ByteBuffer.allocate((int) fch.size());
       fch.read(buffer);
       buffer.flip();
-      metaData = TimeseriesMetadata.deserializeFrom(buffer, true);
+      metaData = TimeseriesMetadata.deserializeFrom(buffer, true, null);
       metaData.setChunkMetadataListBuffer(new PublicBAOS());
       return metaData;
     } catch (IOException e) {