commit 93d2be6ff44b5185cb73570011b77dc5066802b7 Author: stack Date: Thu Mar 26 21:25:35 2015 -0700 Inline vint for ts and do positioning rather than use BB diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java index 6216193..1482ecd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java @@ -954,16 +954,23 @@ public class HFileReaderV2 extends AbstractHFileReader { blockBuffer.reset(); } - protected void readMvccVersion() { + protected void readMvccVersion(final int position) { if (this.reader.shouldIncludeMemstoreTS()) { if (this.reader.decodeMemstoreTS) { - try { - currMemstoreTS = Bytes.readVLong(blockBuffer.array(), blockBuffer.arrayOffset() - + blockBuffer.position()); - currMemstoreTSLen = WritableUtils.getVIntSize(currMemstoreTS); - } catch (Exception e) { - throw new RuntimeException("Error reading memstore timestamp", e); + byte firstByte = blockBuffer.array()[position]; + int len = WritableUtils.decodeVIntSize(firstByte); + if (len == 1) { + currMemstoreTS = firstByte; + } else { + long i = 0; + for (int idx = 0; idx < len-1; idx++) { + byte b = blockBuffer.array()[position + 1 + idx]; + i = i << 8; + i = i | (b & 0xFF); + } + currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i); } + currMemstoreTSLen = len; } else { currMemstoreTS = 0; currMemstoreTSLen = 1; @@ -971,6 +978,10 @@ public class HFileReaderV2 extends AbstractHFileReader { } } + protected void readMvccVersion() { + readMvccVersion(blockBuffer.arrayOffset() + blockBuffer.position()); + } + /** * Within a loaded block, seek looking for the last key that is smaller than * (or equal to?) the key we are interested in. diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV3.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV3.java index 1e4ef27..a2fcd1b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV3.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV3.java @@ -235,8 +235,22 @@ public class HFileReaderV3 extends HFileReaderV2 { } protected final void readKeyValueLen() { + int p = blockBuffer.position() + blockBuffer.arrayOffset(); + currKeyLen = Bytes.toInt(blockBuffer.array(), p); + p += Bytes.SIZEOF_INT; + currValueLen = Bytes.toInt(blockBuffer.array(), p); + p += Bytes.SIZEOF_INT; + p += (currKeyLen + currValueLen); + if (reader.hfileContext.isIncludesTags()) { + currTagsLen = ((blockBuffer.array()[p] & 0xff) << 8) ^ ((blockBuffer.array()[p + 1] & 0xff)); + p += 2; + } + p += currTagsLen; + readMvccVersion(p); + return; // This is a hot method according to -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining. // We do stuff in here to make the method short so can be inlined. + /* this.blockBuffer.mark(); try { setAndCheckKeyValueLen(); @@ -246,6 +260,7 @@ public class HFileReaderV3 extends HFileReaderV2 { } finally { this.blockBuffer.reset(); } + */ } /**