You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2019/11/19 08:52:24 UTC

[incubator-iotdb] branch rel/0.9 updated: Fix a decoder bug (#571)

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

jiangtian pushed a commit to branch rel/0.9
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/rel/0.9 by this push:
     new e257beb  Fix a decoder bug (#571)
e257beb is described below

commit e257beb5a783191068132017cac93046620afc23
Author: Haonan <hh...@outlook.com>
AuthorDate: Tue Nov 19 16:50:13 2019 +0800

    Fix a decoder bug (#571)
    
    * fix decoder bug
---
 .../apache/iotdb/tsfile/encoding/decoder/Decoder.java  | 11 ++++++++++-
 .../iotdb/tsfile/encoding/decoder/PlainDecoder.java    | 18 ++++++++++++++++++
 .../iotdb/tsfile/read/reader/chunk/ChunkReader.java    |  4 +---
 .../iotdb/tsfile/read/reader/page/PageReader.java      |  3 ---
 4 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java
index 02c9682..7c2c5be 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.tsfile.utils.Binary;
 public abstract class Decoder {
 
   private TSEncoding type;
+  private static EndianType endian;
 
   public Decoder(TSEncoding type) {
     this.type = type;
@@ -43,6 +44,14 @@ public abstract class Decoder {
   public TSEncoding getType() {
     return type;
   }
+  
+  public void setEndianType(EndianType endian) {
+    Decoder.endian = endian;
+  }
+  
+  public EndianType getEndianType() {
+    return endian;
+  }
 
   /**
    * get Decoder object by type.
@@ -54,7 +63,7 @@ public abstract class Decoder {
   public static Decoder getDecoderByType(TSEncoding type, TSDataType dataType) {
     // PLA and DFT encoding are not supported in current version
     if (type == TSEncoding.PLAIN) {
-      return new PlainDecoder(EndianType.BIG_ENDIAN);
+      return new PlainDecoder(endian);
     } else if (type == TSEncoding.RLE) {
       switch (dataType) {
         case BOOLEAN:
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/PlainDecoder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/PlainDecoder.java
index c0b263d..8ecfea0 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/PlainDecoder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/PlainDecoder.java
@@ -51,31 +51,49 @@ public class PlainDecoder extends Decoder {
 
   @Override
   public boolean readBoolean(ByteBuffer buffer) {
+    if (this.getEndianType() == EndianType.LITTLE_ENDIAN) {
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+    }
     return buffer.get() != 0;
   }
 
   @Override
   public short readShort(ByteBuffer buffer) {
+    if (this.getEndianType() == EndianType.LITTLE_ENDIAN) {
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+    }
     return buffer.getShort();
   }
 
   @Override
   public int readInt(ByteBuffer buffer) {
+    if (this.getEndianType() == EndianType.LITTLE_ENDIAN) {
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+    }
     return buffer.getInt();
   }
 
   @Override
   public long readLong(ByteBuffer buffer) {
+    if (this.getEndianType() == EndianType.LITTLE_ENDIAN) {
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+    }
     return buffer.getLong();
   }
 
   @Override
   public float readFloat(ByteBuffer buffer) {
+    if (this.getEndianType() == EndianType.LITTLE_ENDIAN) {
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+    }
     return buffer.getFloat();
   }
 
   @Override
   public double readDouble(ByteBuffer buffer) {
+    if (this.getEndianType() == EndianType.LITTLE_ENDIAN) {
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+    }
     return buffer.getDouble();
   }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
index 2ac8350..eb00310 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
@@ -79,6 +79,7 @@ public abstract class ChunkReader {
     this.unCompressor = IUnCompressor.getUnCompressor(chunkHeader.getCompressionType());
     valueDecoder = Decoder
         .getDecoderByType(chunkHeader.getEncodingType(), chunkHeader.getDataType());
+    valueDecoder.setEndianType(endianType);
     data = new BatchData(chunkHeader.getDataType());
     hasCachedPageHeader = false;
   }
@@ -155,9 +156,6 @@ public abstract class ChunkReader {
     chunkDataBuffer.get(compressedPageBody, 0, compressedPageBodyLength);
     valueDecoder.reset();
     ByteBuffer pageData = ByteBuffer.wrap(unCompressor.uncompress(compressedPageBody));
-    if (endianType == EndianType.LITTLE_ENDIAN) {
-      pageData.order(ByteOrder.LITTLE_ENDIAN);
-    }
     PageReader reader = new PageReader(pageData, chunkHeader.getDataType(),
         valueDecoder, timeDecoder, filter);
     reader.setDeletedAt(deletedAt);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java
index f01dce4..7d113e9 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java
@@ -79,9 +79,6 @@ public class PageReader {
     timeBuffer.limit(timeBufferLength);
 
     valueBuffer = pageData.slice();
-    if (pageData.order() == ByteOrder.LITTLE_ENDIAN) {
-      valueBuffer.order(ByteOrder.LITTLE_ENDIAN);
-    }
     valueBuffer.position(timeBufferLength);
   }