HBASE-15064 BufferUnderflowException after last Cell fetched from an HFile Block served from L2 offheap cache - Addendum.
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/cadfb21f Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/cadfb21f Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/cadfb21f Branch: refs/heads/hbase-12439 Commit: cadfb21f4bb465d1e305db2a159b8574282c8150 Parents: 5fcadb8 Author: anoopsjohn <[email protected]> Authored: Wed Mar 23 15:03:50 2016 +0530 Committer: anoopsjohn <[email protected]> Committed: Wed Mar 23 15:03:50 2016 +0530 ---------------------------------------------------------------------- .../apache/hadoop/hbase/nio/MultiByteBuff.java | 3 ++- .../hadoop/hbase/nio/TestMultiByteBuff.java | 25 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/cadfb21f/hbase-common/src/main/java/org/apache/hadoop/hbase/nio/MultiByteBuff.java ---------------------------------------------------------------------- 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..107bb3f 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,8 @@ public class MultiByteBuff extends ByteBuff { */ @Override public final boolean hasRemaining() { - return this.curItem.hasRemaining() || this.curItemIndex < this.items.length - 1; + return this.curItem.hasRemaining() || (this.curItemIndex < this.limitedItemIndex + && this.items[this.curItemIndex + 1].hasRemaining()); } /** http://git-wip-us.apache.org/repos/asf/hbase/blob/cadfb21f/hbase-common/src/test/java/org/apache/hadoop/hbase/nio/TestMultiByteBuff.java ---------------------------------------------------------------------- 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..af4c464 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 @@ -378,4 +378,29 @@ public class TestMultiByteBuff { assertTrue(Bytes.equals(actual, 0, actual.length, b, 1, 3)); } + + @Test + public void testHasRemaining() { + ByteBuffer b1 = ByteBuffer.allocate(8); + ByteBuffer b2 = ByteBuffer.allocate(8); + ByteBuffer b3 = ByteBuffer.allocate(8); + MultiByteBuff mbb1 = new MultiByteBuff(b1, b2, b3); + assertTrue(mbb1.hasRemaining()); + mbb1.limit(20); // Limit in mid of last of BB + mbb1.position(15); + mbb1.get();// We are at the end of second BB + assertTrue(mbb1.hasRemaining()); + mbb1.position(20); + assertFalse(mbb1.hasRemaining()); + mbb1.limit(12); // Limit in mid of second BB + mbb1.position(11); + assertTrue(mbb1.hasRemaining()); + mbb1.get(); // Now we have reached the limit + assertFalse(mbb1.hasRemaining()); + mbb1.limit(16);// Limit at begin of the last BB + mbb1.position(15); + assertTrue(mbb1.hasRemaining()); + mbb1.get(); // Now we have reached the limit + assertFalse(mbb1.hasRemaining()); + } }
