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 b8e4640..7d788f6 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 @@ -933,12 +933,11 @@ 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()); + currMemstoreTS = Bytes.readVLong(blockBuffer.array(), position); currMemstoreTSLen = WritableUtils.getVIntSize(currMemstoreTS); } catch (Exception e) { throw new RuntimeException("Error reading memstore timestamp", e); @@ -950,6 +949,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 b28d8c1..1dd24ab 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 @@ -204,9 +204,24 @@ public class HFileReaderV3 extends HFileReaderV2 { } protected 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;/* blockBuffer.mark(); currKeyLen = blockBuffer.getInt(); + p = blockBuffer.position() + blockBuffer.arrayOffset(); currValueLen = blockBuffer.getInt(); + p = blockBuffer.position() + blockBuffer.arrayOffset(); if (currKeyLen < 0 || currValueLen < 0 || currKeyLen > blockBuffer.limit() || currValueLen > blockBuffer.limit()) { throw new IllegalStateException("Invalid currKeyLen " + currKeyLen + " or currValueLen " @@ -215,6 +230,7 @@ public class HFileReaderV3 extends HFileReaderV2 { + blockBuffer.position() + " (without header)."); } ByteBufferUtils.skip(blockBuffer, currKeyLen + currValueLen); + p = blockBuffer.position() + blockBuffer.arrayOffset(); if (reader.hfileContext.isIncludesTags()) { // Read short as unsigned, high byte first currTagsLen = ((blockBuffer.get() & 0xff) << 8) ^ (blockBuffer.get() & 0xff); @@ -225,8 +241,19 @@ public class HFileReaderV3 extends HFileReaderV2 { } ByteBufferUtils.skip(blockBuffer, currTagsLen); } + p = blockBuffer.position() + blockBuffer.arrayOffset(); readMvccVersion(); + p = blockBuffer.position() + blockBuffer.arrayOffset(); blockBuffer.reset(); + p = blockBuffer.position() + blockBuffer.arrayOffset(); + // p = blockBuffer.arrayOffset() + blockBuffer.position();*/ + /*int currKeyLen = Bytes.toInt(blockBuffer.array(), p); + int currValueLen = Bytes.toInt(blockBuffer.array(), p + Bytes.SIZEOF_INT); + currMemstoreTS = 0; + currMemstoreTSLen = 1; + if (copycurrKeyLen != this.currKeyLen) { + int x = 0; + }*/ } /**