.../org/apache/hadoop/hbase/nio/MultiByteBuff.java | 9 +++++- .../apache/hadoop/hbase/nio/TestMultiByteBuff.java | 34 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) 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 ab2b5ea..683438c 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 @@ -472,7 +472,14 @@ public class MultiByteBuff extends ByteBuff { */ @Override public final boolean hasRemaining() { - return this.curItem.hasRemaining() || this.curItemIndex < this.items.length - 1; + if(this.curItem.hasRemaining()) { + return true; + } else { + if(curItemIndex <= this.limitedItemIndex) { + return this.items[limitedItemIndex].hasRemaining(); + } + } + return false; } /** 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 800c8e1..9d069cc 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 @@ -344,6 +344,40 @@ public class TestMultiByteBuff { } @Test + public void testLimit() throws Exception { + byte[] b = new byte[4]; + byte[] b1 = new byte[8]; + for (int i = 0; i < b.length; i++) { + b[i] = (byte) i; + } + for (int i = 0; i < b1.length; i++) { + b1[i] = (byte) (b1.length + i); + } + ByteBuffer bb1 = ByteBuffer.wrap(b); + ByteBuffer bb2 = ByteBuffer.wrap(b1); + ByteBuffer bb3 = ByteBuffer.allocate(4); + MultiByteBuff mbb1 = new MultiByteBuff(bb1, bb2, bb3); + mbb1.limit(14); + for(int i = 0; i < 14; i++) { + mbb1.get(); + } + assertFalse(mbb1.hasRemaining()); + + mbb1 = new MultiByteBuff(bb1, bb2, bb3); + mbb1.limit(14); + for(int i = 0; i < 13; i++) { + mbb1.get(); + } + assertTrue(mbb1.hasRemaining()); + + mbb1 = new MultiByteBuff(bb1, bb2, bb3); + mbb1.limit(4); + for(int i = 0; i < 4; i++) { + mbb1.get(); + } + assertFalse(mbb1.hasRemaining()); + } + @Test public void testToBytes() throws Exception { byte[] b = new byte[4]; byte[] b1 = new byte[8];