Skip to content
Permalink
Browse files
HBASE-26344 Fix Bug for MultiByteBuff.put(int, byte) (#3741)
Signed-off-by: Duo Zhang <zhangduo@apache.org>
  • Loading branch information
comnetwork committed Oct 14, 2021
1 parent 6e7e69a commit b898661ad0511c1fc8f73d6e6c2499a268e20aac
Showing 3 changed files with 100 additions and 24 deletions.
@@ -181,6 +181,9 @@ public byte getByteAfterPosition(int offset) {
* 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 MultiByteBuff put(byte b) {
}

/**
* 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;
@@ -594,4 +594,58 @@ private void doTestPositionalPutByteBuff(ByteBuff srcByteBuff) throws Exception
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);
}
}
}
@@ -1263,26 +1263,44 @@ public void testEncodedValueCheck() {
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);

0 comments on commit b898661

Please sign in to comment.