diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java index bdd3913..cc55826 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java @@ -621,6 +621,17 @@ public class ScanQueryMatcher { } } + public int compareKeyForHint(byte[] nextIndexed, Cell kv) throws IOException { + Cell hint = getNextKeyHint(kv); + if (hint == null) return 1; + + return rowComparator.compareKey(nextIndexed, 0, nextIndexed.length, + hint.getRowArray(), hint.getRowOffset(), hint.getRowLength(), + hint.getFamilyArray(), hint.getFamilyOffset(), hint.getFamilyLength(), + hint.getQualifierArray(), hint.getQualifierOffset(), hint.getQualifierLength(), + HConstants.OLDEST_TIMESTAMP, Type.Minimum.getCode()); + } + //Used only for testing purposes static MatchCode checkColumn(ColumnTracker columnTracker, byte[] bytes, int offset, int length, long ttl, byte type, boolean ignoreCount) throws IOException { @@ -650,11 +661,6 @@ public class ScanQueryMatcher { SKIP, /** - * Do not include, jump to next StoreFile or memstore (in time order) - */ - NEXT, - - /** * Do not include, return current result */ DONE, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java index 8da3752..a8dbd1f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java @@ -579,7 +579,8 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner * See if we should actually SEEK or rather just SKIP to the next Cell. * (See HBASE-13109) */ - private ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) { + private ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) + throws IOException { byte[] nextIndexedKey = getNextIndexedKey(); if (nextIndexedKey == null || nextIndexedKey == HConstants.NO_NEXT_INDEXED_KEY || store == null) { @@ -602,6 +603,11 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner } break; } + case SEEK_NEXT_USING_HINT: + if (matcher.compareKeyForHint(nextIndexedKey, cell) >= 0) { + return MatchCode.SKIP; + } + break; default: break; }