You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2021/10/14 14:53:33 UTC

[hbase] branch master updated: HBASE-26344 Fix Bug for MultiByteBuff.put(int, byte) (#3741)

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

zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new b898661  HBASE-26344 Fix Bug for MultiByteBuff.put(int, byte) (#3741)
b898661 is described below

commit b898661ad0511c1fc8f73d6e6c2499a268e20aac
Author: chenglei <ch...@apache.org>
AuthorDate: Thu Oct 14 22:53:09 2021 +0800

    HBASE-26344 Fix Bug for MultiByteBuff.put(int, byte) (#3741)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
---
 .../org/apache/hadoop/hbase/nio/MultiByteBuff.java | 12 +++--
 .../apache/hadoop/hbase/nio/TestMultiByteBuff.java | 54 ++++++++++++++++++++
 .../apache/hadoop/hbase/util/TestOrderedBytes.java | 58 ++++++++++++++--------
 3 files changed, 100 insertions(+), 24 deletions(-)

diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/nio/MultiByteBuff.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/nio/MultiByteBuff.java
index a25791e..f9000ed 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/nio/MultiByteBuff.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/nio/MultiByteBuff.java
@@ -181,6 +181,9 @@ public class MultiByteBuff extends ByteBuff {
    * Returns in which sub ByteBuffer, the given element index will be available.
    */
   private int getItemIndex(int elemIndex) {
+    if (elemIndex < 0) {
+      throw new IndexOutOfBoundsException();
+    }
     int index = 1;
     while (elemIndex >= this.itemBeginPos[index]) {
       index++;
@@ -721,15 +724,16 @@ public class MultiByteBuff extends ByteBuff {
   }
 
   /**
-   * Writes a byte to this MBB at the given index
-   * @param index
-   * @param b
+   * Writes a byte to this MBB at the given index and won't affect the position of any of the
+   * buffers.
    * @return this object
+   * @throws IndexOutOfBoundsException If <tt>index</tt> is negative or not smaller than the
+   *           {@link MultiByteBuff#limit}
    */
   @Override
   public MultiByteBuff put(int index, byte b) {
     checkRefCount();
-    int itemIndex = getItemIndex(limit);
+    int itemIndex = getItemIndex(index);
     ByteBuffer item = items[itemIndex];
     item.put(index - itemBeginPos[itemIndex], b);
     return this;
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/nio/TestMultiByteBuff.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/nio/TestMultiByteBuff.java
index 563f82a..b40ac0c 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/nio/TestMultiByteBuff.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/nio/TestMultiByteBuff.java
@@ -594,4 +594,58 @@ public class TestMultiByteBuff {
       assertTrue(e != null);
     }
   }
+
+  @Test
+  public void testPositionalPutByte() throws Exception {
+    ByteBuffer bb1 = ByteBuffer.allocate(50);
+    ByteBuffer bb2 = ByteBuffer.allocate(50);
+    ByteBuffer bb3 = ByteBuffer.allocate(50);
+    ByteBuffer bb4 = ByteBuffer.allocate(50);
+    MultiByteBuff srcMultiByteBuff = new MultiByteBuff(bb1, bb2, bb3, bb4);
+    for (int i = 1; i <= 200; i++) {
+      srcMultiByteBuff.put((byte) 0xff);
+    }
+
+    srcMultiByteBuff.put(20, (byte) 0);
+    byte val = srcMultiByteBuff.get(20);
+    assertTrue(val == 0);
+
+    srcMultiByteBuff.put(50, (byte) 0);
+    val = srcMultiByteBuff.get(50);
+    assertTrue(val == 0);
+
+    srcMultiByteBuff.put(80, (byte) 0);
+    val = srcMultiByteBuff.get(80);
+    assertTrue(val == 0);
+
+    srcMultiByteBuff.put(100, (byte) 0);
+    val = srcMultiByteBuff.get(100);
+    assertTrue(val == 0);
+
+    srcMultiByteBuff.put(121, (byte) 0);
+    val = srcMultiByteBuff.get(121);
+    assertTrue(val == 0);
+
+    srcMultiByteBuff.put(150, (byte) 0);
+    val = srcMultiByteBuff.get(150);
+    assertTrue(val == 0);
+
+    srcMultiByteBuff.put(180, (byte) 0);
+    val = srcMultiByteBuff.get(180);
+    assertTrue(val == 0);
+
+    try {
+      srcMultiByteBuff.put(200, (byte) 0);
+      fail();
+    } catch (IndexOutOfBoundsException e) {
+      assertTrue(e != null);
+    }
+
+    try {
+      srcMultiByteBuff.put(260, (byte) 0);
+      fail();
+    } catch (IndexOutOfBoundsException e) {
+      assertTrue(e != null);
+    }
+  }
 }
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestOrderedBytes.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestOrderedBytes.java
index 45b8e35..c8e0381 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestOrderedBytes.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestOrderedBytes.java
@@ -1263,26 +1263,44 @@ public class TestOrderedBytes {
     int cnt = 0;
     PositionedByteRange buff = new SimplePositionedMutableByteRange(1024);
     for (Order ord : new Order[] { Order.ASCENDING, Order.DESCENDING }) {
-      int o;
-      o = OrderedBytes.encodeNull(buff, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, negInf, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, negLarge, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, negMed, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, negSmall, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, zero, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, posSmall, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, posMed, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, posLarge, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, posInf, ord); cnt++;
-      o = OrderedBytes.encodeNumeric(buff, nan, ord); cnt++;
-      o = OrderedBytes.encodeInt8(buff, int8, ord); cnt++;
-      o = OrderedBytes.encodeInt16(buff, int16, ord); cnt++;
-      o = OrderedBytes.encodeInt32(buff, int32, ord); cnt++;
-      o = OrderedBytes.encodeInt64(buff, int64, ord); cnt++;
-      o = OrderedBytes.encodeFloat32(buff, float32, ord); cnt++;
-      o = OrderedBytes.encodeFloat64(buff, float64, ord); cnt++;
-      o = OrderedBytes.encodeString(buff, text, ord); cnt++;
-      o = OrderedBytes.encodeBlobVar(buff, blobVar, ord); cnt++;
+      OrderedBytes.encodeNull(buff, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, negInf, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, negLarge, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, negMed, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, negSmall, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, zero, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, posSmall, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, posMed, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, posLarge, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, posInf, ord);
+      cnt++;
+      OrderedBytes.encodeNumeric(buff, nan, ord);
+      cnt++;
+      OrderedBytes.encodeInt8(buff, int8, ord);
+      cnt++;
+      OrderedBytes.encodeInt16(buff, int16, ord);
+      cnt++;
+      OrderedBytes.encodeInt32(buff, int32, ord);
+      cnt++;
+      OrderedBytes.encodeInt64(buff, int64, ord);
+      cnt++;
+      OrderedBytes.encodeFloat32(buff, float32, ord);
+      cnt++;
+      OrderedBytes.encodeFloat64(buff, float64, ord);
+      cnt++;
+      OrderedBytes.encodeString(buff, text, ord);
+      cnt++;
+      OrderedBytes.encodeBlobVar(buff, blobVar, ord);
+      cnt++;
     }
 
     buff.setPosition(0);