You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by nd...@apache.org on 2022/06/13 12:21:43 UTC

[hbase] branch branch-2.4 updated: HBASE-26856 BufferedDataBlockEncoder.OnheapDecodedCell value can get corrupted

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

ndimiduk pushed a commit to branch branch-2.4
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2.4 by this push:
     new b2f71f2049c HBASE-26856 BufferedDataBlockEncoder.OnheapDecodedCell value can get corrupted
b2f71f2049c is described below

commit b2f71f2049c73c53ed7fe1400e8ff25612667b62
Author: Mohammad Arshad <ar...@apache.org>
AuthorDate: Tue May 17 10:54:38 2022 +0530

    HBASE-26856 BufferedDataBlockEncoder.OnheapDecodedCell value can get corrupted
    
    Created OnheapDecodedCell and OffheapDecodedExtendedCell objects with duplicate copy of
    ByteBuffer's underlying array instead of original ByteBuffer
    
    Signed-off-by: Andrew Purtell <ap...@apache.org>
    Signed-off-by: Pankaj Kumar<pa...@apache.org>
---
 .../io/encoding/BufferedDataBlockEncoder.java      | 24 +++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
index b155d9b854e..6e5a3bda3af 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
@@ -232,9 +232,10 @@ abstract class BufferedDataBlockEncoder extends AbstractDataBlockEncoder {
       int tOffset = 0;
       if (this.includeTags) {
         if (this.tagCompressionContext == null) {
-          tagsArray = valAndTagsBuffer.array();
           tOffset =
             valAndTagsBuffer.arrayOffset() + vOffset + this.valueLength + tagsLenSerializationSize;
+          tagsArray = Bytes.copy(valAndTagsBuffer.array(), tOffset, this.tagsLength);
+          tOffset = 0;
         } else {
           tagsArray = Bytes.copy(tagsBuffer, 0, this.tagsLength);
           tOffset = 0;
@@ -243,9 +244,9 @@ abstract class BufferedDataBlockEncoder extends AbstractDataBlockEncoder {
       return new OnheapDecodedCell(Bytes.copy(keyBuffer, 0, this.keyLength),
         currentKey.getRowLength(), currentKey.getFamilyOffset(), currentKey.getFamilyLength(),
         currentKey.getQualifierOffset(), currentKey.getQualifierLength(), currentKey.getTimestamp(),
-        currentKey.getTypeByte(), valAndTagsBuffer.array(),
-        valAndTagsBuffer.arrayOffset() + vOffset, this.valueLength, memstoreTS, tagsArray, tOffset,
-        this.tagsLength);
+        currentKey.getTypeByte(), Bytes.copy(valAndTagsBuffer.array(),
+          valAndTagsBuffer.arrayOffset() + vOffset, this.valueLength),
+        0, this.valueLength, memstoreTS, tagsArray, tOffset, this.tagsLength);
     }
 
     private Cell toOffheapCell(ByteBuffer valAndTagsBuffer, int vOffset,
@@ -254,13 +255,26 @@ abstract class BufferedDataBlockEncoder extends AbstractDataBlockEncoder {
       int tOffset = 0;
       if (this.includeTags) {
         if (this.tagCompressionContext == null) {
-          tagsBuf = valAndTagsBuffer;
           tOffset = vOffset + this.valueLength + tagsLenSerializationSize;
+          byte[] output = new byte[this.tagsLength];
+          ByteBufferUtils.copyFromBufferToArray(output, valAndTagsBuffer, tOffset, 0,
+            this.tagsLength);
+          tagsBuf = ByteBuffer.wrap(output);
+          tOffset = 0;
         } else {
           tagsBuf = ByteBuffer.wrap(Bytes.copy(tagsBuffer, 0, this.tagsLength));
           tOffset = 0;
         }
       }
+
+      if (this.valueLength > 0) {
+        byte[] output = new byte[this.valueLength];
+        ByteBufferUtils.copyFromBufferToArray(output, valAndTagsBuffer, vOffset, 0,
+          this.valueLength);
+        valAndTagsBuffer = ByteBuffer.wrap(output);
+        vOffset = 0;
+      }
+
       return new OffheapDecodedExtendedCell(
         ByteBuffer.wrap(Bytes.copy(keyBuffer, 0, this.keyLength)), currentKey.getRowLength(),
         currentKey.getFamilyOffset(), currentKey.getFamilyLength(), currentKey.getQualifierOffset(),