You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/08/03 08:28:24 UTC

[iotdb] branch IOTDB-4016 created (now 841d9e8880)

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

jackietien pushed a change to branch IOTDB-4016
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 841d9e8880 Fix Calculating size for same TsBlock is not consistent between SinkHandle and SourceHandle

This branch includes the following new commits:

     new 841d9e8880 Fix Calculating size for same TsBlock is not consistent between SinkHandle and SourceHandle

The 1 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] 01/01: Fix Calculating size for same TsBlock is not consistent between SinkHandle and SourceHandle

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

jackietien pushed a commit to branch IOTDB-4016
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 841d9e8880d5df396d94f3cf1fc3c111c2f866f5
Author: JackieTien97 <ja...@gmail.com>
AuthorDate: Wed Aug 3 10:23:10 2022 +0800

    Fix Calculating size for same TsBlock is not consistent between SinkHandle and SourceHandle
---
 .../operator/schema/SchemaFetchMergeOperator.java  |   4 +-
 .../operator/schema/SchemaFetchScanOperator.java   |   4 +-
 .../db/mpp/execution/ConfigExecutionTest.java      |   3 +-
 .../block/column/BinaryArrayColumnEncoder.java     |  26 ++--
 .../block/column/ByteArrayColumnEncoder.java       |  19 +--
 .../block/column/Int32ArrayColumnEncoder.java      |  37 +++---
 .../block/column/Int64ArrayColumnEncoder.java      |  64 ++++++----
 .../tsfile/common/block/TsBlockSerdeTest.java      | 139 ++++++++++++++++-----
 8 files changed, 195 insertions(+), 101 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchMergeOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchMergeOperator.java
index 416abb9c77..92b023eabb 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchMergeOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchMergeOperator.java
@@ -120,8 +120,6 @@ public class SchemaFetchMergeOperator implements ProcessOperator {
     return new TsBlock(
         new TimeColumn(1, new long[] {0}),
         new BinaryColumn(
-            1,
-            Optional.of(new boolean[] {false}),
-            new Binary[] {new Binary(outputStream.toByteArray())}));
+            1, Optional.empty(), new Binary[] {new Binary(outputStream.toByteArray())}));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java
index e35ed7aba2..3a22065879 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java
@@ -126,8 +126,6 @@ public class SchemaFetchScanOperator implements SourceOperator {
         new TsBlock(
             new TimeColumn(1, new long[] {0}),
             new BinaryColumn(
-                1,
-                Optional.of(new boolean[] {false}),
-                new Binary[] {new Binary(outputStream.toByteArray())}));
+                1, Optional.empty(), new Binary[] {new Binary(outputStream.toByteArray())}));
   }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/execution/ConfigExecutionTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/execution/ConfigExecutionTest.java
index f43e702772..83930c083b 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/execution/ConfigExecutionTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/execution/ConfigExecutionTest.java
@@ -65,8 +65,7 @@ public class ConfigExecutionTest {
   public void normalConfigTaskWithResultTest() {
     TsBlock tsBlock =
         new TsBlock(
-            new TimeColumn(1, new long[] {0}),
-            new IntColumn(1, Optional.of(new boolean[] {false}), new int[] {1}));
+            new TimeColumn(1, new long[] {0}), new IntColumn(1, Optional.empty(), new int[] {1}));
     DatasetHeader datasetHeader =
         new DatasetHeader(
             Collections.singletonList(new ColumnHeader("TestValue", TSDataType.INT32)), false);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java
index 715bfe7786..af707fb97c 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/BinaryArrayColumnEncoder.java
@@ -44,24 +44,30 @@ public class BinaryArrayColumnEncoder implements ColumnEncoder {
     //    | int32         | bytes |
     //    +---------------+-------+
 
-    boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, positionCount);
+    if (!TSDataType.TEXT.equals(dataType)) {
+      throw new IllegalArgumentException("Invalid data type: " + dataType);
+    }
 
-    if (TSDataType.TEXT.equals(dataType)) {
-      ColumnBuilder columnBuilder = new BinaryColumnBuilder(null, positionCount);
+    boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, positionCount);
+    Binary[] values = new Binary[positionCount];
+    if (nullIndicators == null) {
       for (int i = 0; i < positionCount; i++) {
-        if (nullIndicators == null || !nullIndicators[i]) {
+        int length = input.getInt();
+        byte[] value = new byte[length];
+        input.get(value);
+        values[i] = new Binary(value);
+      }
+    } else {
+      for (int i = 0; i < positionCount; i++) {
+        if (!nullIndicators[i]) {
           int length = input.getInt();
           byte[] value = new byte[length];
           input.get(value);
-          columnBuilder.writeBinary(new Binary(value));
-        } else {
-          columnBuilder.appendNull();
+          values[i] = new Binary(value);
         }
       }
-      return columnBuilder.build();
-    } else {
-      throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
+    return new BinaryColumn(0, positionCount, nullIndicators, values);
   }
 
   @Override
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java
index f4fac3a1f0..7636189a7b 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/ByteArrayColumnEncoder.java
@@ -37,21 +37,14 @@ public class ByteArrayColumnEncoder implements ColumnEncoder {
     //    | byte          | list[byte]      | list[byte]  |
     //    +---------------+-----------------+-------------+
 
-    boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, positionCount);
-    if (TSDataType.BOOLEAN.equals(dataType)) {
-      BooleanColumnBuilder columnBuilder = new BooleanColumnBuilder(null, positionCount);
-      boolean[] values = ColumnEncoder.deserializeBooleanArray(input, positionCount);
-      for (int i = 0; i < positionCount; i++) {
-        if (nullIndicators == null || !nullIndicators[i]) {
-          columnBuilder.writeBoolean(values[i]);
-        } else {
-          columnBuilder.appendNull();
-        }
-      }
-      return columnBuilder.build();
-    } else {
+    if (!TSDataType.BOOLEAN.equals(dataType)) {
       throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
+
+    boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, positionCount);
+    boolean[] values = ColumnEncoder.deserializeBooleanArray(input, positionCount);
+
+    return new BooleanColumn(0, positionCount, nullIndicators, values);
   }
 
   @Override
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java
index 23339473fb..9abc4fca1e 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int32ArrayColumnEncoder.java
@@ -39,30 +39,37 @@ public class Int32ArrayColumnEncoder implements ColumnEncoder {
 
     boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, positionCount);
 
-    ColumnBuilder columnBuilder;
     if (TSDataType.INT32.equals(dataType)) {
-      columnBuilder = new IntColumnBuilder(null, positionCount);
-      for (int i = 0; i < positionCount; i++) {
-        if (nullIndicators == null || !nullIndicators[i]) {
-          columnBuilder.writeInt(input.getInt());
-        } else {
-          columnBuilder.appendNull();
+      int[] values = new int[positionCount];
+      if (nullIndicators == null) {
+        for (int i = 0; i < positionCount; i++) {
+          values[i] = input.getInt();
+        }
+      } else {
+        for (int i = 0; i < positionCount; i++) {
+          if (!nullIndicators[i]) {
+            values[i] = input.getInt();
+          }
         }
       }
+      return new IntColumn(0, positionCount, nullIndicators, values);
     } else if (TSDataType.FLOAT.equals(dataType)) {
-      columnBuilder = new FloatColumnBuilder(null, positionCount);
-      for (int i = 0; i < positionCount; i++) {
-        if (nullIndicators == null || !nullIndicators[i]) {
-          columnBuilder.writeFloat(Float.intBitsToFloat(input.getInt()));
-        } else {
-          columnBuilder.appendNull();
+      float[] values = new float[positionCount];
+      if (nullIndicators == null) {
+        for (int i = 0; i < positionCount; i++) {
+          values[i] = Float.intBitsToFloat(input.getInt());
+        }
+      } else {
+        for (int i = 0; i < positionCount; i++) {
+          if (!nullIndicators[i]) {
+            values[i] = Float.intBitsToFloat(input.getInt());
+          }
         }
       }
+      return new FloatColumn(0, positionCount, nullIndicators, values);
     } else {
       throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
-
-    return columnBuilder.build();
   }
 
   @Override
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java
index 9264564185..7af3790bc7 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/Int64ArrayColumnEncoder.java
@@ -29,23 +29,28 @@ public class Int64ArrayColumnEncoder implements ColumnEncoder {
 
   @Override
   public TimeColumn readTimeColumn(ByteBuffer input, int positionCount) {
-    return (TimeColumn)
-        readColumnInternal(new TimeColumnBuilder(null, positionCount), input, positionCount);
-  }
 
-  @Override
-  public Column readColumn(ByteBuffer input, TSDataType dataType, int positionCount) {
-    if (TSDataType.INT64.equals(dataType)) {
-      return readColumnInternal(new LongColumnBuilder(null, positionCount), input, positionCount);
-    } else if (TSDataType.DOUBLE.equals(dataType)) {
-      return readColumnInternal(new DoubleColumnBuilder(null, positionCount), input, positionCount);
+    // Serialized data layout:
+    //    +---------------+-----------------+-------------+
+    //    | may have null | null indicators |   values    |
+    //    +---------------+-----------------+-------------+
+    //    | byte          | list[byte]      | list[int64] |
+    //    +---------------+-----------------+-------------+
+
+    boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, positionCount);
+    long[] values = new long[positionCount];
+    if (nullIndicators == null) {
+      for (int i = 0; i < positionCount; i++) {
+        values[i] = input.getLong();
+      }
+      return new TimeColumn(0, positionCount, values);
     } else {
-      throw new IllegalArgumentException("Invalid data type: " + dataType);
+      throw new IllegalArgumentException("TimeColumn should not contain null values.");
     }
   }
 
-  private Column readColumnInternal(
-      ColumnBuilder columnBuilder, ByteBuffer input, int positionCount) {
+  @Override
+  public Column readColumn(ByteBuffer input, TSDataType dataType, int positionCount) {
 
     // Serialized data layout:
     //    +---------------+-----------------+-------------+
@@ -55,27 +60,38 @@ public class Int64ArrayColumnEncoder implements ColumnEncoder {
     //    +---------------+-----------------+-------------+
 
     boolean[] nullIndicators = ColumnEncoder.deserializeNullIndicators(input, positionCount);
-    TSDataType dataType = columnBuilder.getDataType();
+
     if (TSDataType.INT64.equals(dataType)) {
-      for (int i = 0; i < positionCount; i++) {
-        if (nullIndicators == null || !nullIndicators[i]) {
-          columnBuilder.writeLong(input.getLong());
-        } else {
-          columnBuilder.appendNull();
+      long[] values = new long[positionCount];
+      if (nullIndicators == null) {
+        for (int i = 0; i < positionCount; i++) {
+          values[i] = input.getLong();
+        }
+      } else {
+        for (int i = 0; i < positionCount; i++) {
+          if (!nullIndicators[i]) {
+            values[i] = input.getLong();
+          }
         }
       }
+      return new LongColumn(0, positionCount, nullIndicators, values);
     } else if (TSDataType.DOUBLE.equals(dataType)) {
-      for (int i = 0; i < positionCount; i++) {
-        if (nullIndicators == null || !nullIndicators[i]) {
-          columnBuilder.writeDouble(Double.longBitsToDouble(input.getLong()));
-        } else {
-          columnBuilder.appendNull();
+      double[] values = new double[positionCount];
+      if (nullIndicators == null) {
+        for (int i = 0; i < positionCount; i++) {
+          values[i] = Double.longBitsToDouble(input.getLong());
+        }
+      } else {
+        for (int i = 0; i < positionCount; i++) {
+          if (!nullIndicators[i]) {
+            values[i] = Double.longBitsToDouble(input.getLong());
+          }
         }
       }
+      return new DoubleColumn(0, positionCount, nullIndicators, values);
     } else {
       throw new IllegalArgumentException("Invalid data type: " + dataType);
     }
-    return columnBuilder.build();
   }
 
   @Override
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/TsBlockSerdeTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/TsBlockSerdeTest.java
index eb69736dbf..0ba21589fa 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/TsBlockSerdeTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/common/block/TsBlockSerdeTest.java
@@ -22,18 +22,25 @@ package org.apache.iotdb.tsfile.common.block;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.iotdb.tsfile.read.common.block.column.BinaryColumn;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnBuilder;
 import org.apache.iotdb.tsfile.read.common.block.column.ColumnEncoding;
+import org.apache.iotdb.tsfile.read.common.block.column.TimeColumn;
 import org.apache.iotdb.tsfile.read.common.block.column.TsBlockSerde;
 import org.apache.iotdb.tsfile.utils.Binary;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
-import org.junit.Assert;
 import org.junit.Test;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 public class TsBlockSerdeTest {
   @Test
@@ -72,41 +79,111 @@ public class TsBlockSerdeTest {
       ByteBuffer output = tsBlockSerde.serialize(tsBlockBuilder.build());
       output.rewind();
       int valueColumnCount = output.getInt();
-      Assert.assertEquals(6, valueColumnCount);
-      Assert.assertEquals(TSDataType.INT32, TSDataType.deserialize(output.get()));
-      Assert.assertEquals(TSDataType.FLOAT, TSDataType.deserialize(output.get()));
-      Assert.assertEquals(TSDataType.INT64, TSDataType.deserialize(output.get()));
-      Assert.assertEquals(TSDataType.DOUBLE, TSDataType.deserialize(output.get()));
-      Assert.assertEquals(TSDataType.BOOLEAN, TSDataType.deserialize(output.get()));
-      Assert.assertEquals(TSDataType.TEXT, TSDataType.deserialize(output.get()));
-      Assert.assertEquals(positionCount, output.getInt());
-      Assert.assertEquals(ColumnEncoding.INT64_ARRAY, ColumnEncoding.deserializeFrom(output));
-      Assert.assertEquals(ColumnEncoding.INT32_ARRAY, ColumnEncoding.deserializeFrom(output));
-      Assert.assertEquals(ColumnEncoding.INT32_ARRAY, ColumnEncoding.deserializeFrom(output));
-      Assert.assertEquals(ColumnEncoding.INT64_ARRAY, ColumnEncoding.deserializeFrom(output));
-      Assert.assertEquals(ColumnEncoding.INT64_ARRAY, ColumnEncoding.deserializeFrom(output));
-      Assert.assertEquals(ColumnEncoding.BYTE_ARRAY, ColumnEncoding.deserializeFrom(output));
-      Assert.assertEquals(ColumnEncoding.BINARY_ARRAY, ColumnEncoding.deserializeFrom(output));
+      assertEquals(6, valueColumnCount);
+      assertEquals(TSDataType.INT32, TSDataType.deserialize(output.get()));
+      assertEquals(TSDataType.FLOAT, TSDataType.deserialize(output.get()));
+      assertEquals(TSDataType.INT64, TSDataType.deserialize(output.get()));
+      assertEquals(TSDataType.DOUBLE, TSDataType.deserialize(output.get()));
+      assertEquals(TSDataType.BOOLEAN, TSDataType.deserialize(output.get()));
+      assertEquals(TSDataType.TEXT, TSDataType.deserialize(output.get()));
+      assertEquals(positionCount, output.getInt());
+      assertEquals(ColumnEncoding.INT64_ARRAY, ColumnEncoding.deserializeFrom(output));
+      assertEquals(ColumnEncoding.INT32_ARRAY, ColumnEncoding.deserializeFrom(output));
+      assertEquals(ColumnEncoding.INT32_ARRAY, ColumnEncoding.deserializeFrom(output));
+      assertEquals(ColumnEncoding.INT64_ARRAY, ColumnEncoding.deserializeFrom(output));
+      assertEquals(ColumnEncoding.INT64_ARRAY, ColumnEncoding.deserializeFrom(output));
+      assertEquals(ColumnEncoding.BYTE_ARRAY, ColumnEncoding.deserializeFrom(output));
+      assertEquals(ColumnEncoding.BINARY_ARRAY, ColumnEncoding.deserializeFrom(output));
 
       output.rewind();
       TsBlock tsBlock = tsBlockSerde.deserialize(output);
-      Assert.assertEquals(valueColumnCount, tsBlock.getValueColumnCount());
-      Assert.assertEquals(TSDataType.INT32, tsBlock.getColumn(0).getDataType());
-      Assert.assertEquals(TSDataType.FLOAT, tsBlock.getColumn(1).getDataType());
-      Assert.assertEquals(TSDataType.INT64, tsBlock.getColumn(2).getDataType());
-      Assert.assertEquals(TSDataType.DOUBLE, tsBlock.getColumn(3).getDataType());
-      Assert.assertEquals(TSDataType.BOOLEAN, tsBlock.getColumn(4).getDataType());
-      Assert.assertEquals(TSDataType.TEXT, tsBlock.getColumn(5).getDataType());
-      Assert.assertEquals(positionCount, tsBlock.getPositionCount());
-      Assert.assertEquals(ColumnEncoding.INT32_ARRAY, tsBlock.getColumn(0).getEncoding());
-      Assert.assertEquals(ColumnEncoding.INT32_ARRAY, tsBlock.getColumn(1).getEncoding());
-      Assert.assertEquals(ColumnEncoding.INT64_ARRAY, tsBlock.getColumn(2).getEncoding());
-      Assert.assertEquals(ColumnEncoding.INT64_ARRAY, tsBlock.getColumn(3).getEncoding());
-      Assert.assertEquals(ColumnEncoding.BYTE_ARRAY, tsBlock.getColumn(4).getEncoding());
-      Assert.assertEquals(ColumnEncoding.BINARY_ARRAY, tsBlock.getColumn(5).getEncoding());
+      assertEquals(valueColumnCount, tsBlock.getValueColumnCount());
+      assertEquals(TSDataType.INT32, tsBlock.getColumn(0).getDataType());
+      assertEquals(TSDataType.FLOAT, tsBlock.getColumn(1).getDataType());
+      assertEquals(TSDataType.INT64, tsBlock.getColumn(2).getDataType());
+      assertEquals(TSDataType.DOUBLE, tsBlock.getColumn(3).getDataType());
+      assertEquals(TSDataType.BOOLEAN, tsBlock.getColumn(4).getDataType());
+      assertEquals(TSDataType.TEXT, tsBlock.getColumn(5).getDataType());
+      assertEquals(positionCount, tsBlock.getPositionCount());
+      assertEquals(ColumnEncoding.INT32_ARRAY, tsBlock.getColumn(0).getEncoding());
+      assertEquals(ColumnEncoding.INT32_ARRAY, tsBlock.getColumn(1).getEncoding());
+      assertEquals(ColumnEncoding.INT64_ARRAY, tsBlock.getColumn(2).getEncoding());
+      assertEquals(ColumnEncoding.INT64_ARRAY, tsBlock.getColumn(3).getEncoding());
+      assertEquals(ColumnEncoding.BYTE_ARRAY, tsBlock.getColumn(4).getEncoding());
+      assertEquals(ColumnEncoding.BINARY_ARRAY, tsBlock.getColumn(5).getEncoding());
+    } catch (IOException e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void testSerializeAndDeserialize2() {
+
+    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    try {
+      // to indicate this binary data is storage group info
+      ReadWriteIOUtils.write((byte) 0, outputStream);
+
+      ReadWriteIOUtils.write(1, outputStream);
+      ReadWriteIOUtils.write("root.test.g_0", outputStream);
+    } catch (IOException e) {
+      // Totally memory operation. This case won't happen.
+      fail(e.getMessage());
+    }
+
+    TsBlock tsBlock =
+        new TsBlock(
+            new TimeColumn(1, new long[] {0}),
+            new BinaryColumn(
+                1, Optional.empty(), new Binary[] {new Binary(outputStream.toByteArray())}));
+
+    TsBlockSerde tsBlockSerde = new TsBlockSerde();
+    try {
+      ByteBuffer output = tsBlockSerde.serialize(tsBlock);
+      output.rewind();
+
+      TsBlock deserializedTsBlock = tsBlockSerde.deserialize(output);
+      assertEquals(tsBlock.getRetainedSizeInBytes(), deserializedTsBlock.getRetainedSizeInBytes());
+    } catch (IOException e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void testSerializeAndDeserialize3() {
+
+    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    try {
+      // to indicate this binary data is storage group info
+      ReadWriteIOUtils.write((byte) 0, outputStream);
+
+      ReadWriteIOUtils.write(1, outputStream);
+      ReadWriteIOUtils.write("root.test.g_0", outputStream);
+    } catch (IOException e) {
+      // Totally memory operation. This case won't happen.
+      fail(e.getMessage());
+    }
+
+    TsBlock tsBlock =
+        new TsBlock(
+            new TimeColumn(1, new long[] {0}),
+            new BinaryColumn(
+                1,
+                Optional.of(new boolean[] {false}),
+                new Binary[] {new Binary(outputStream.toByteArray())}));
+
+    TsBlockSerde tsBlockSerde = new TsBlockSerde();
+    try {
+      ByteBuffer output = tsBlockSerde.serialize(tsBlock);
+      output.rewind();
+
+      TsBlock deserializedTsBlock = tsBlockSerde.deserialize(output);
+      assertEquals(tsBlock.getRetainedSizeInBytes(), deserializedTsBlock.getRetainedSizeInBytes());
     } catch (IOException e) {
       e.printStackTrace();
-      Assert.fail();
+      fail();
     }
   }
 }