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; 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. 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; 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 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) {