You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jm...@apache.org on 2016/01/14 18:08:39 UTC

[25/50] [abbrv] 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/trunk
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());
+  }
+}