You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by sy...@apache.org on 2016/01/07 17:58:42 UTC
[10/17] hbase git commit: HBASE-15064 BufferUnderflowException after
last Cell fetched from an HFile Block served from L2 offheap cache.
HBASE-15064 BufferUnderflowException after last Cell fetched from an HFile Block served from L2 offheap cache.
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/7cd09bfb
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/7cd09bfb
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/7cd09bfb
Branch: refs/heads/hbase-12439
Commit: 7cd09bfb91e829a7595b97842e64cfd8edcd97f9
Parents: e8fbc9b
Author: anoopsjohn <an...@gmail.com>
Authored: Wed Jan 6 10:25:32 2016 +0530
Committer: anoopsjohn <an...@gmail.com>
Committed: Wed Jan 6 10:25:32 2016 +0530
----------------------------------------------------------------------
.../hadoop/hbase/util/ByteBufferArray.java | 5 +++
.../hadoop/hbase/util/TestByteBufferArray.java | 43 ++++++++++++++++++++
2 files changed, 48 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/7cd09bfb/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ByteBufferArray.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ByteBufferArray.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ByteBufferArray.java
index 986d6e0..2334cf7 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ByteBufferArray.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ByteBufferArray.java
@@ -219,6 +219,11 @@ public final class ByteBufferArray {
long end = offset + len;
int startBuffer = (int) (offset / bufferSize), startBufferOffset = (int) (offset % bufferSize);
int endBuffer = (int) (end / bufferSize), endBufferOffset = (int) (end % bufferSize);
+ // Last buffer in the array is a dummy one with 0 capacity. Avoid sending back that
+ if (endBuffer == this.bufferCount) {
+ endBuffer--;
+ endBufferOffset = bufferSize;
+ }
assert startBuffer >= 0 && startBuffer < bufferCount;
assert endBuffer >= 0 && endBuffer < bufferCount
|| (endBuffer == bufferCount && endBufferOffset == 0);
http://git-wip-us.apache.org/repos/asf/hbase/blob/7cd09bfb/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestByteBufferArray.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestByteBufferArray.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestByteBufferArray.java
new file mode 100644
index 0000000..701601d
--- /dev/null
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestByteBufferArray.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.util;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.hadoop.hbase.nio.ByteBuff;
+import org.apache.hadoop.hbase.testclassification.MiscTests;
+import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category({MiscTests.class, SmallTests.class})
+public class TestByteBufferArray {
+
+ @Test
+ public void testAsSubBufferWhenEndOffsetLandInLastBuffer() throws Exception {
+ int capacity = 4 * 1024 * 1024;
+ ByteBufferArray array = new ByteBufferArray(capacity, false);
+ ByteBuff subBuf = array.asSubByteBuff(0, capacity);
+ subBuf.position(capacity - 1);// Position to the last byte
+ assertTrue(subBuf.hasRemaining());
+ // Read last byte
+ subBuf.get();
+ assertFalse(subBuf.hasRemaining());
+ }
+}