Hi Dongfang,

In this PR, you modified the format of TsFile. Can you update the document
to describe the new TsFile format? The document to describe TsFile is very
important.

I suggest you update this document and submit it to the confluence:
https://cwiki.apache.org/confluence/display/IOTDB

(We have an old version on the previous git repo wiki:
https://github.com/thulab/iotdb/wiki/%5BTsFile%5D-What-is-new-from-v0.7.0--to-Kill_Thanos
)

Best,
-----------------------------------
Xiangdong Huang
School of Software, Tsinghua University

 黄向东
清华大学 软件学院


<[email protected]> 于2019年2月20日周三 下午6:41写道:

> This is an automated email from the ASF dual-hosted git repository.
>
> east pushed a commit to branch east_update_chunkgroupmetadata
> in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
>
>
> The following commit(s) were added to
> refs/heads/east_update_chunkgroupmetadata by this push:
>      new f96662f  add offset and size for ChunkGroupMetaData
> f96662f is described below
>
> commit f96662fc764f86dfc99f941ec00ea76108924dee
> Author: mdf369 <[email protected]>
> AuthorDate: Wed Feb 20 18:41:20 2019 +0800
>
>     add offset and size for ChunkGroupMetaData
> ---
>  .../apache/iotdb}/tsfile/TsFileRead.java           |  0
>  .../apache/iotdb}/tsfile/TsFileSequenceRead.java   | 28
> ++++++++++++++++------
>  .../apache/iotdb}/tsfile/TsFileWrite.java          |  2 ++
>  .../tsfile/file/metadata/ChunkGroupMetaData.java   | 20 ++++++++--------
>  .../iotdb/tsfile/write/writer/TsFileIOWriter.java  |  4 +---
>  5 files changed, 34 insertions(+), 20 deletions(-)
>
> diff --git
> a/tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileRead.java
> b/tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
> similarity index 100%
> rename from
> tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileRead.java
> rename to
> tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
> diff --git
> a/tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileSequenceRead.java
> b/tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileSequenceRead.java
> similarity index 84%
> rename from
> tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileSequenceRead.java
> rename to
> tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileSequenceRead.java
> index faecbdd..c973369 100644
> ---
> a/tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileSequenceRead.java
> +++
> b/tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileSequenceRead.java
> @@ -21,6 +21,7 @@ package org.apache.iotdb.tsfile;
>  import java.io.File;
>  import java.io.IOException;
>  import java.nio.ByteBuffer;
> +import java.util.ArrayList;
>  import java.util.List;
>  import java.util.stream.Collectors;
>  import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
> @@ -39,11 +40,12 @@ import
> org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
>  import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
>  import org.apache.iotdb.tsfile.read.common.BatchData;
>  import org.apache.iotdb.tsfile.read.reader.page.PageReader;
> +import org.apache.iotdb.tsfile.utils.Pair;
>
>  public class TsFileSequenceRead {
>
> -  public static void main(String[] args) throws IOException {
> -    TsFileSequenceReader reader = new TsFileSequenceReader("test.tsfile");
> +  public static void main(String[] args) throws Exception {
> +    TsFileSequenceReader reader = new
> TsFileSequenceReader("/Users/East/projects/IoTDB/incubator-iotdb/tsfile/src/test/resources/test.tsfile");
>      System.out.println("file length: " + new
> File("test.tsfile").length());
>      System.out.println("file magic head: " + reader.readHeadMagic());
>      System.out.println("file magic tail: " + reader.readTailMagic());
> @@ -54,12 +56,14 @@ public class TsFileSequenceRead {
>      // first SeriesChunks (headers and data) in one ChunkGroup, then the
> CHUNK_GROUP_FOOTER
>      // Because we do not know how many chunks a ChunkGroup may have, we
> should read one byte (the marker) ahead and
>      // judge accordingly.
> +    List<Pair<Long, Long>> offsetList = new ArrayList<>();
> +    long startOffset = reader.position();
>      System.out.println("[Chunk Group]");
>      System.out.println("position: " + reader.position());
>      byte marker;
> -    while ((marker = reader.readMarker()) != MetaMarker.Separator) {
> +    while ((marker = reader.readMarker()) != MetaMarker.SEPARATOR) {
>        switch (marker) {
> -        case MetaMarker.ChunkHeader:
> +        case MetaMarker.CHUNK_HEADER:
>            System.out.println("\t[Chunk]");
>            System.out.println("\tposition: " + reader.position());
>            ChunkHeader header = reader.readChunkHeader();
> @@ -90,28 +94,38 @@ public class TsFileSequenceRead {
>              }
>            }
>            break;
> -        case MetaMarker.ChunkGroupFooter:
> +        case MetaMarker.CHUNK_GROUP_FOOTER:
>            System.out.println("Chunk Group Footer position: " +
> reader.position());
>            ChunkGroupFooter chunkGroupFooter =
> reader.readChunkGroupFooter();
>            System.out.println("device: " + chunkGroupFooter.getDeviceID());
> +          long endOffset = reader.position();
> +          offsetList.add(new Pair<>(startOffset, endOffset));
> +          startOffset = endOffset;
>            break;
>          default:
>            MetaMarker.handleUnexpectedMarker(marker);
>        }
>      }
>      System.out.println("[Metadata]");
> +    int offsetListIndex = 0;
>      List<TsDeviceMetadataIndex> deviceMetadataIndexList =
> metaData.getDeviceMap().values().stream()
>          .sorted((x, y) -> (int) (x.getOffset() -
> y.getOffset())).collect(Collectors.toList());
>      for (TsDeviceMetadataIndex index : deviceMetadataIndexList) {
>        TsDeviceMetadata deviceMetadata =
> reader.readTsDeviceMetaData(index);
> -      List<ChunkGroupMetaData> chunkGroupMetaDataList =
> deviceMetadata.getChunkGroups();
> +      List<ChunkGroupMetaData> chunkGroupMetaDataList =
> deviceMetadata.getChunkGroupMetaDataList();
>        for (ChunkGroupMetaData chunkGroupMetaData :
> chunkGroupMetaDataList) {
>          System.out.println(String
>              .format("\t[Device]File Offset: %d, Device %s, Number of
> Chunk Groups %d",
>                  index.getOffset(), chunkGroupMetaData.getDeviceID(),
>                  chunkGroupMetaDataList.size()));
> +
> +        Pair<Long, Long> pair = offsetList.get(offsetListIndex++);
> +        if (chunkGroupMetaData.getOffsetOfChunkGroupHeader() != pair.left
> || chunkGroupMetaData.getEndPositionOfChunkGroup() != pair.right) {
> +          throw new Exception("Wrong offset of chunk group meta data!");
> +        }
> +
>          for (ChunkMetaData chunkMetadata :
> chunkGroupMetaData.getChunkMetaDataList()) {
> -          System.out.println("\t\tMeasurement:" +
> chunkMetadata.getMeasurementUID());
> +          System.out.println("\t\tMeasurement:" +
> chunkMetadata.getMeasurementUid());
>            System.out.println("\t\tFile offset:" +
> chunkMetadata.getOffsetOfChunkHeader());
>          }
>        }
> diff --git
> a/tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileWrite.java
> b/tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileWrite.java
> similarity index 97%
> rename from
> tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileWrite.java
> rename to
> tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileWrite.java
> index 37b69be..367cbde 100644
> --- a/tsfile/example/src/main/java/cn/edu/tsinghua/tsfile/TsFileWrite.java
> +++ b/tsfile/example/src/main/java/org/apache/iotdb/tsfile/TsFileWrite.java
> @@ -29,6 +29,8 @@ import
> org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
>  import org.apache.iotdb.tsfile.write.TsFileWriter;
>  import org.apache.iotdb.tsfile.write.record.TSRecord;
>  import org.apache.iotdb.tsfile.write.record.datapoint.DataPoint;
> +import org.apache.iotdb.tsfile.write.record.datapoint.FloatDataPoint;
> +import org.apache.iotdb.tsfile.write.record.datapoint.IntDataPoint;
>  import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
>
>  /**
> diff --git
> a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetaData.java
> b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetaData.java
> index 99db769..1884b18 100644
> ---
> a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetaData.java
> +++
> b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetaData.java
> @@ -49,10 +49,10 @@ public class ChunkGroupMetaData {
>    private long offsetOfChunkGroupHeader;
>
>    /**
> -   * Byte size of the corresponding data in the file Notice: include the
> chunk group header and marker.
> +   * End Byte position of the whole chunk group in the file Notice:
> position after the chunk group footer.
>     * For Hadoop and Spark.
>     */
> -  private long sizeOfChunkGroup;
> +  private long endPositionOfChunkGroup;
>
>    /**
>     * All time series chunks in this chunk group.
> @@ -94,7 +94,7 @@ public class ChunkGroupMetaData {
>
>      chunkGroupMetaData.deviceID =
> ReadWriteIOUtils.readString(inputStream);
>      chunkGroupMetaData.offsetOfChunkGroupHeader =
> ReadWriteIOUtils.readLong(inputStream);
> -    chunkGroupMetaData.sizeOfChunkGroup =
> ReadWriteIOUtils.readLong(inputStream);
> +    chunkGroupMetaData.endPositionOfChunkGroup =
> ReadWriteIOUtils.readLong(inputStream);
>
>      int size = ReadWriteIOUtils.readInt(inputStream);
>      chunkGroupMetaData.serializedSize =
> @@ -123,7 +123,7 @@ public class ChunkGroupMetaData {
>
>      chunkGroupMetaData.deviceID = ReadWriteIOUtils.readString(buffer);
>      chunkGroupMetaData.offsetOfChunkGroupHeader =
> ReadWriteIOUtils.readLong(buffer);
> -    chunkGroupMetaData.sizeOfChunkGroup =
> ReadWriteIOUtils.readLong(buffer);
> +    chunkGroupMetaData.endPositionOfChunkGroup =
> ReadWriteIOUtils.readLong(buffer);
>
>      int size = ReadWriteIOUtils.readInt(buffer);
>
> @@ -182,12 +182,12 @@ public class ChunkGroupMetaData {
>      return offsetOfChunkGroupHeader;
>    }
>
> -  public long getSizeOfChunkGroup() {
> -    return sizeOfChunkGroup;
> +  public long getEndPositionOfChunkGroup() {
> +    return endPositionOfChunkGroup;
>    }
>
> -  public void setSizeOfChunkGroup(long sizeOfChunkGroup) {
> -    this.sizeOfChunkGroup = sizeOfChunkGroup;
> +  public void setEndPositionOfChunkGroup(long endPositionOfChunkGroup) {
> +    this.endPositionOfChunkGroup = endPositionOfChunkGroup;
>    }
>
>    /**
> @@ -201,7 +201,7 @@ public class ChunkGroupMetaData {
>      int byteLen = 0;
>      byteLen += ReadWriteIOUtils.write(deviceID, outputStream);
>      byteLen += ReadWriteIOUtils.write(offsetOfChunkGroupHeader,
> outputStream);
> -    byteLen += ReadWriteIOUtils.write(sizeOfChunkGroup, outputStream);
> +    byteLen += ReadWriteIOUtils.write(endPositionOfChunkGroup,
> outputStream);
>
>      byteLen += ReadWriteIOUtils.write(chunkMetaDataList.size(),
> outputStream);
>      for (ChunkMetaData chunkMetaData : chunkMetaDataList) {
> @@ -223,7 +223,7 @@ public class ChunkGroupMetaData {
>
>      byteLen += ReadWriteIOUtils.write(deviceID, buffer);
>      byteLen += ReadWriteIOUtils.write(offsetOfChunkGroupHeader, buffer);
> -    byteLen += ReadWriteIOUtils.write(sizeOfChunkGroup, buffer);
> +    byteLen += ReadWriteIOUtils.write(endPositionOfChunkGroup, buffer);
>
>      byteLen += ReadWriteIOUtils.write(chunkMetaDataList.size(), buffer);
>      for (ChunkMetaData chunkMetaData : chunkMetaDataList) {
> diff --git
> a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
> b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
> index 54de973..f40f1bd 100644
> ---
> a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
> +++
> b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
> @@ -192,10 +192,8 @@ public class TsFileIOWriter {
>     * @param chunkGroupFooter -use to serialize
>     */
>    public void endChunkGroup(ChunkGroupFooter chunkGroupFooter) throws
> IOException {
> -    long pos = out.getPosition();
>      chunkGroupFooter.serializeTo(out.wrapAsStream());
> -    long chunkGroupFooterSize = out.getPosition() - pos;
> -
> currentChunkGroupMetaData.setSizeOfChunkGroup(chunkGroupFooter.getDataSize()
> + chunkGroupFooterSize);
> +
> currentChunkGroupMetaData.setEndPositionOfChunkGroup(out.getPosition());
>      chunkGroupMetaDataList.add(currentChunkGroupMetaData);
>      LOG.debug("end chunk group:{}", currentChunkGroupMetaData);
>      currentChunkGroupMetaData = null;
>
>

Reply via email to