You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2015/10/20 22:55:40 UTC

hbase git commit: HBASE-14628 [0.98] Save object creation for scanning with block encodings.

Repository: hbase
Updated Branches:
  refs/heads/0.98 834035bac -> d5867a4d9


HBASE-14628 [0.98] Save object creation for scanning with block encodings.


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/d5867a4d
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/d5867a4d
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/d5867a4d

Branch: refs/heads/0.98
Commit: d5867a4d95ba2c795b411bf0537551f476653c49
Parents: 834035b
Author: Lars Hofhansl <la...@apache.org>
Authored: Tue Oct 20 13:55:22 2015 -0700
Committer: Lars Hofhansl <la...@apache.org>
Committed: Tue Oct 20 13:55:22 2015 -0700

----------------------------------------------------------------------
 .../io/encoding/BufferedDataBlockEncoder.java   | 46 +++++++-------------
 .../hbase/io/encoding/DataBlockEncoder.java     |  4 --
 .../codec/prefixtree/PrefixTreeSeeker.java      |  8 ----
 .../io/encoding/TestDataBlockEncoders.java      | 18 ++++----
 4 files changed, 25 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/d5867a4d/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
index 4d1cb91..93f43b3 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
@@ -222,50 +222,36 @@ abstract class BufferedDataBlockEncoder implements DataBlockEncoder {
     }
 
     @Override
-    public ByteBuffer getKeyValueBuffer() {
-      ByteBuffer kvBuffer = createKVBuffer();
-      kvBuffer.putInt(current.keyLength);
-      kvBuffer.putInt(current.valueLength);
-      kvBuffer.put(current.keyBuffer, 0, current.keyLength);
-      kvBuffer.put(currentBuffer.array(),
-          currentBuffer.arrayOffset() + current.valueOffset,
-          current.valueLength);
+    public KeyValue getKeyValue() {
+      byte[] kvBuf = new byte[(int)KeyValue.getKeyValueDataStructureSize(current.keyLength,
+          current.valueLength, current.tagsLength)];
+      int offset = Bytes.putInt(kvBuf, 0, current.keyLength);
+      offset = Bytes.putInt(kvBuf, offset, current.valueLength);
+      System.arraycopy(current.keyBuffer, 0, kvBuf, offset, current.keyLength);
+      offset += current.keyLength;
+      System.arraycopy(currentBuffer.array(),
+        currentBuffer.arrayOffset() + current.valueOffset, kvBuf, offset, current.valueLength);
+      offset += current.valueLength;
       if (current.tagsLength > 0) {
         // Put short as unsigned
-        kvBuffer.put((byte)(current.tagsLength >> 8 & 0xff));
-        kvBuffer.put((byte)(current.tagsLength & 0xff));
+        offset = Bytes.putByte(kvBuf, offset, (byte)(current.tagsLength >> 8 & 0xff));
+        offset = Bytes.putByte(kvBuf, offset, (byte)(current.tagsLength & 0xff));
         if (current.tagsOffset != -1) {
           // the offset of the tags bytes in the underlying buffer is marked. So the temp
           // buffer,tagsBuffer was not been used.
-          kvBuffer.put(currentBuffer.array(), currentBuffer.arrayOffset() + current.tagsOffset,
-              current.tagsLength);
+          System.arraycopy(currentBuffer.array(), currentBuffer.arrayOffset() + current.tagsOffset, kvBuf, offset, current.tagsLength);
         } else {
           // When tagsOffset is marked as -1, tag compression was present and so the tags were
           // uncompressed into temp buffer, tagsBuffer. Let us copy it from there
-          kvBuffer.put(current.tagsBuffer, 0, current.tagsLength);
+          System.arraycopy(current.tagsBuffer, 0, kvBuf, offset, current.tagsLength);
         }
       }
-      kvBuffer.rewind();
-      return kvBuffer;
-    }
 
-    protected ByteBuffer createKVBuffer() {
-      int kvBufSize = (int) KeyValue.getKeyValueDataStructureSize(current.keyLength,
-          current.valueLength, current.tagsLength);
-      ByteBuffer kvBuffer = ByteBuffer.allocate(kvBufSize);
-      return kvBuffer;
-    }
-
-    @Override
-    public KeyValue getKeyValue() {
-      ByteBuffer kvBuf = getKeyValueBuffer();
       KeyValue kv;
       if (current.tagsLength == 0) {
-        kv = new NoTagsKeyValue(kvBuf.array(), kvBuf.arrayOffset(), kvBuf.array().length
-            - kvBuf.arrayOffset());
+        kv = new NoTagsKeyValue(kvBuf, 0, kvBuf.length);
       } else {
-        kv = new KeyValue(kvBuf.array(), kvBuf.arrayOffset(), kvBuf.array().length
-            - kvBuf.arrayOffset());
+        kv = new KeyValue(kvBuf, 0, kvBuf.length);
       }
       kv.setMvccVersion(current.memstoreTS);
       return kv;

http://git-wip-us.apache.org/repos/asf/hbase/blob/d5867a4d/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java
index aa859e4..222b5fe 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java
@@ -139,10 +139,6 @@ public interface DataBlockEncoder {
      */
     ByteBuffer getValueShallowCopy();
 
-    // TODO : To be removed - Used only in test cases.
-    /** @return key value buffer with the position set to the beginning*/
-    ByteBuffer getKeyValueBuffer();
-
     /**
      * @return the KeyValue object at the current position. Includes memstore
      *         timestamp.

http://git-wip-us.apache.org/repos/asf/hbase/blob/d5867a4d/hbase-prefix-tree/src/main/java/org/apache/hadoop/hbase/codec/prefixtree/PrefixTreeSeeker.java
----------------------------------------------------------------------
diff --git a/hbase-prefix-tree/src/main/java/org/apache/hadoop/hbase/codec/prefixtree/PrefixTreeSeeker.java b/hbase-prefix-tree/src/main/java/org/apache/hadoop/hbase/codec/prefixtree/PrefixTreeSeeker.java
index ac12b70..35c24b6 100644
--- a/hbase-prefix-tree/src/main/java/org/apache/hadoop/hbase/codec/prefixtree/PrefixTreeSeeker.java
+++ b/hbase-prefix-tree/src/main/java/org/apache/hadoop/hbase/codec/prefixtree/PrefixTreeSeeker.java
@@ -84,14 +84,6 @@ public class PrefixTreeSeeker implements EncodedSeeker {
    * currently must do deep copy into new array
    */
   @Override
-  public ByteBuffer getKeyValueBuffer() {
-    return KeyValueUtil.copyToNewByteBuffer(ptSearcher.current());
-  }
-
-  /**
-   * currently must do deep copy into new array
-   */
-  @Override
   public KeyValue getKeyValue() {
     if (ptSearcher.current() == null) {
       return null;

http://git-wip-us.apache.org/repos/asf/hbase/blob/d5867a4d/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java
index 748352e..da227be 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java
@@ -288,27 +288,27 @@ public class TestDataBlockEncoders {
       int i = 0;
       do {
         KeyValue expectedKeyValue = sampleKv.get(i);
-        ByteBuffer keyValue = seeker.getKeyValueBuffer();
-        if (0 != Bytes.compareTo(keyValue.array(), keyValue.arrayOffset(), keyValue.limit(),
+        KeyValue keyValue = seeker.getKeyValue();
+        if (0 != Bytes.compareTo(keyValue.getBuffer(), keyValue.getOffset(), keyValue.getLength(),
             expectedKeyValue.getBuffer(), expectedKeyValue.getOffset(),
             expectedKeyValue.getLength())) {
 
           int commonPrefix = 0;
-          byte[] left = keyValue.array();
+          byte[] left = keyValue.getBuffer();
           byte[] right = expectedKeyValue.getBuffer();
-          int leftOff = keyValue.arrayOffset();
+          int leftOff = keyValue.getOffset();
           int rightOff = expectedKeyValue.getOffset();
-          int length = Math.min(keyValue.limit(), expectedKeyValue.getLength());
+          int length = Math.min(keyValue.getLength(), expectedKeyValue.getLength());
           while (commonPrefix < length
               && left[commonPrefix + leftOff] == right[commonPrefix + rightOff]) {
             commonPrefix++;
           }
 
           fail(String.format("next() produces wrong results "
-              + "encoder: %s i: %d commonPrefix: %d" + "\n expected %s\n actual      %s", encoder
+              + "encoder: %s i: %d commonPrefix: %d" + "\n expected %s\n actual   %s", encoder
               .toString(), i, commonPrefix, Bytes.toStringBinary(expectedKeyValue.getBuffer(),
               expectedKeyValue.getOffset(), expectedKeyValue.getLength()), Bytes
-              .toStringBinary(keyValue)));
+              .toStringBinary(keyValue.getBuffer())));
         }
         i++;
       } while (seeker.next());
@@ -355,7 +355,7 @@ public class TestDataBlockEncoders {
   
   private void checkSeekingConsistency(List<DataBlockEncoder.EncodedSeeker> encodedSeekers,
       boolean seekBefore, KeyValue keyValue) {
-    ByteBuffer expectedKeyValue = null;
+    KeyValue expectedKeyValue = null;
     ByteBuffer expectedKey = null;
     ByteBuffer expectedValue = null;
 
@@ -364,7 +364,7 @@ public class TestDataBlockEncoders {
           keyValue.getKeyLength(), seekBefore);
       seeker.rewind();
 
-      ByteBuffer actualKeyValue = seeker.getKeyValueBuffer();
+      KeyValue actualKeyValue = seeker.getKeyValue();
       ByteBuffer actualKey = seeker.getKeyDeepCopy();
       ByteBuffer actualValue = seeker.getValueShallowCopy();
       if (expectedKeyValue != null) {