Index: src/main/java/org/apache/hadoop/hbase/io/hfile/AbstractHFileReader.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/io/hfile/AbstractHFileReader.java (revision 1531495) +++ src/main/java/org/apache/hadoop/hbase/io/hfile/AbstractHFileReader.java (working copy) @@ -354,4 +354,9 @@ public DataBlockEncoding getEncodingOnDisk() { return dataBlockEncoder.getEncodingOnDisk(); } + + @Override + public boolean hasMVCCInfo() { + return true; + } } Index: src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java (revision 1531495) +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java (working copy) @@ -522,6 +522,8 @@ void close(boolean evictOnClose) throws IOException; DataBlockEncoding getEncodingOnDisk(); + + boolean hasMVCCInfo(); } /** Index: src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java (revision 1531495) +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java (working copy) @@ -371,6 +371,11 @@ } } + @Override + public boolean hasMVCCInfo() { + return includesMemstoreTS && decodeMemstoreTS; + } + /** * Compares the actual type of a block retrieved from cache or disk with its * expected type and throws an exception in case of a mismatch. Expected Index: src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java (revision 1531495) +++ src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java (working copy) @@ -1424,7 +1424,7 @@ boolean isCompaction) { return new StoreFileScanner(this, getScanner(cacheBlocks, pread, - isCompaction), !isCompaction); + isCompaction), !isCompaction, reader.hasMVCCInfo()); } /** Index: src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java (revision 1531495) +++ src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java (working copy) @@ -51,6 +51,7 @@ private KeyValue delayedSeekKV; private boolean enforceMVCC = false; + private boolean hasMVCCInfo = false; private static AtomicLong seekCount; @@ -60,10 +61,11 @@ * Implements a {@link KeyValueScanner} on top of the specified {@link HFileScanner} * @param hfs HFile scanner */ - public StoreFileScanner(StoreFile.Reader reader, HFileScanner hfs, boolean useMVCC) { + public StoreFileScanner(StoreFile.Reader reader, HFileScanner hfs, boolean useMVCC, boolean hasMVCC) { this.reader = reader; this.hfs = hfs; this.enforceMVCC = useMVCC; + this.hasMVCCInfo = hasMVCC; } /** @@ -124,7 +126,8 @@ if (cur != null) { hfs.next(); cur = hfs.getKeyValue(); - skipKVsNewerThanReadpoint(); + if (hasMVCCInfo) + skipKVsNewerThanReadpoint(); } } catch(IOException e) { throw new IOException("Could not iterate " + this, e); @@ -144,7 +147,7 @@ cur = hfs.getKeyValue(); - return skipKVsNewerThanReadpoint(); + return !hasMVCCInfo ? true : skipKVsNewerThanReadpoint(); } finally { realSeekDone = true; }