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 2013/10/25 18:58:40 UTC
svn commit: r1535781 - in
/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io:
encoding/BufferedDataBlockEncoder.java encoding/DataBlockEncoder.java
hfile/HFileReaderV2.java
Author: larsh
Date: Fri Oct 25 16:58:39 2013
New Revision: 1535781
URL: http://svn.apache.org/r1535781
Log:
HBASE-9807 block encoder unnecessarily copies the key for each reseek
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java?rev=1535781&r1=1535780&r2=1535781&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java Fri Oct 25 16:58:39 2013
@@ -125,6 +125,11 @@ abstract class BufferedDataBlockEncoder
}
@Override
+ public int compareKey(RawComparator<byte[]> comparator, byte[] key, int offset, int length) {
+ return comparator.compare(key, offset, length, current.keyBuffer, 0, current.keyLength);
+ }
+
+ @Override
public void setCurrentBuffer(ByteBuffer buffer) {
currentBuffer = buffer;
decodeFirst();
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java?rev=1535781&r1=1535780&r2=1535781&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java Fri Oct 25 16:58:39 2013
@@ -156,5 +156,15 @@ public interface DataBlockEncoder {
*/
public int seekToKeyInBlock(byte[] key, int offset, int length,
boolean seekBefore);
+
+ /**
+ * Compare the given key against the current key
+ * @param comparator
+ * @param key
+ * @param offset
+ * @param length
+ * @return -1 is the passed key is smaller than the current key, 0 if equal and 1 if greater
+ */
+ public int compareKey(RawComparator<byte []> comparator, byte[] key, int offset, int length);
}
}
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java?rev=1535781&r1=1535780&r2=1535781&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java Fri Oct 25 16:58:39 2013
@@ -38,6 +38,7 @@ import org.apache.hadoop.hbase.io.hfile.
import org.apache.hadoop.hbase.io.hfile.HFile.FileInfo;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.IdLock;
+import org.apache.hadoop.io.RawComparator;
import org.apache.hadoop.io.WritableUtils;
/**
@@ -514,9 +515,7 @@ public class HFileReaderV2 extends Abstr
public int reseekTo(byte[] key, int offset, int length) throws IOException {
int compared;
if (isSeeked()) {
- ByteBuffer bb = getKey();
- compared = reader.getComparator().compare(key, offset,
- length, bb.array(), bb.arrayOffset(), bb.limit());
+ compared = compareKey(reader.getComparator(), key, offset, length);
if (compared < 1) {
// If the required key is less than or equal to current key, then
// don't do anything.
@@ -608,6 +607,16 @@ public class HFileReaderV2 extends Abstr
return curBlock;
}
+ /**
+ * Compare the given key against the current key
+ * @param comparator
+ * @param key
+ * @param offset
+ * @param length
+ * @return -1 is the passed key is smaller than the current key, 0 if equal and 1 if greater
+ */
+ public abstract int compareKey(RawComparator<byte[]> comparator, byte[] key, int offset,
+ int length);
}
/**
@@ -647,6 +656,12 @@ public class HFileReaderV2 extends Abstr
}
@Override
+ public int compareKey(RawComparator<byte []> comparator, byte[] key, int offset, int length) {
+ return comparator.compare(key, offset, length, blockBuffer.array(), blockBuffer.arrayOffset()
+ + blockBuffer.position() + KEY_VALUE_LEN_SIZE, currKeyLen);
+ }
+
+ @Override
public ByteBuffer getValue() {
assertSeeked();
return ByteBuffer.wrap(
@@ -1042,6 +1057,11 @@ public class HFileReaderV2 extends Abstr
}
@Override
+ public int compareKey(RawComparator<byte []> comparator, byte[] key, int offset, int length) {
+ return seeker.compareKey(comparator, key, offset, length);
+ }
+
+ @Override
public ByteBuffer getValue() {
assertValidSeek();
return seeker.getValueShallowCopy();