HBASE-21590 Optimize trySkipToNextColumn in StoreScanner a bit. (cherry picked from commit 11193d7cc1f5a0a7ffb73777da7ce5c1b6af6c8c)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4020fd4c Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4020fd4c Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4020fd4c Branch: refs/heads/branch-2.0 Commit: 4020fd4c4268facbaee40bd6733168635103ee4e Parents: 5d94ad6 Author: Lars Hofhansl <la...@apache.org> Authored: Thu Dec 13 11:56:39 2018 -0800 Committer: Sean Busbey <bus...@apache.org> Committed: Fri Dec 14 15:50:10 2018 -0600 ---------------------------------------------------------------------- .../apache/hadoop/hbase/regionserver/StoreScanner.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/4020fd4c/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java ---------------------------------------------------------------------- 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 1ca1faa..cd2ab40 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 @@ -785,12 +785,16 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner @VisibleForTesting protected boolean trySkipToNextRow(Cell cell) throws IOException { Cell nextCell = null; + // used to guard against a changed next indexed key by doing a identity comparison + // when the identity changes we need to compare the bytes again + Cell previousIndexedKey = null; do { Cell nextIndexedKey = getNextIndexedKey(); if (nextIndexedKey != null && nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY - && matcher.compareKeyForNextRow(nextIndexedKey, cell) >= 0) { + && (nextIndexedKey == previousIndexedKey || matcher.compareKeyForNextRow(nextIndexedKey, cell) >= 0)) { this.heap.next(); ++kvsScanned; + previousIndexedKey = nextIndexedKey; } else { return false; } @@ -806,12 +810,16 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner @VisibleForTesting protected boolean trySkipToNextColumn(Cell cell) throws IOException { Cell nextCell = null; + // used to guard against a changed next indexed key by doing a identity comparison + // when the identity changes we need to compare the bytes again + Cell previousIndexedKey = null; do { Cell nextIndexedKey = getNextIndexedKey(); if (nextIndexedKey != null && nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY - && matcher.compareKeyForNextColumn(nextIndexedKey, cell) >= 0) { + && (nextIndexedKey == previousIndexedKey || matcher.compareKeyForNextColumn(nextIndexedKey, cell) >= 0)) { this.heap.next(); ++kvsScanned; + previousIndexedKey = nextIndexedKey; } else { return false; }