Repository: hbase Updated Branches: refs/heads/branch-1.1 d49e54a82 -> d2d3c149e
HBASE-14227 Reduce the number of time row comparison is done in a Scan (Ram) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/d2d3c149 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/d2d3c149 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/d2d3c149 Branch: refs/heads/branch-1.1 Commit: d2d3c149e6165b1308e565f3ee3136b10ac95b0b Parents: d49e54a Author: ramkrishna <ramkrishna.s.vasude...@gmail.com> Authored: Fri Jan 8 10:42:11 2016 +0530 Committer: ramkrishna <ramkrishna.s.vasude...@gmail.com> Committed: Fri Jan 8 10:54:21 2016 +0530 ---------------------------------------------------------------------- .../hbase/regionserver/ScanQueryMatcher.java | 32 +++++++++++--------- .../hadoop/hbase/regionserver/StoreScanner.java | 20 ++++++++++-- 2 files changed, 35 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/d2d3c149/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java ---------------------------------------------------------------------- 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 032b4ce..901dbad 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 @@ -278,23 +278,27 @@ public class ScanQueryMatcher { if (filter != null && filter.filterAllRemaining()) { return MatchCode.DONE_SCAN; } - int ret = this.rowComparator.compareRows(row, this.rowOffset, this.rowLength, + if (row != null) { + int ret = this.rowComparator.compareRows(row, this.rowOffset, this.rowLength, cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()); - if (!this.isReversed) { - if (ret <= -1) { - return MatchCode.DONE; - } else if (ret >= 1) { - // could optimize this, if necessary? - // Could also be called SEEK_TO_CURRENT_ROW, but this - // should be rare/never happens. - return MatchCode.SEEK_NEXT_ROW; + if (!this.isReversed) { + if (ret <= -1) { + return MatchCode.DONE; + } else if (ret >= 1) { + // could optimize this, if necessary? + // Could also be called SEEK_TO_CURRENT_ROW, but this + // should be rare/never happens. + return MatchCode.SEEK_NEXT_ROW; + } + } else { + if (ret <= -1) { + return MatchCode.SEEK_NEXT_ROW; + } else if (ret >= 1) { + return MatchCode.DONE; + } } } else { - if (ret <= -1) { - return MatchCode.SEEK_NEXT_ROW; - } else if (ret >= 1) { - return MatchCode.DONE; - } + return MatchCode.DONE; } // optimize case. http://git-wip-us.apache.org/repos/asf/hbase/blob/d2d3c149/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 9f86d4d..d610523 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 @@ -511,8 +511,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner // If no limits exists in the scope LimitScope.Between_Cells then we are sure we are changing // rows. Else it is possible we are still traversing the same row so we must perform the row // comparison. - if (!scannerContext.hasAnyLimit(LimitScope.BETWEEN_CELLS) || matcher.row == null || - !Bytes.equals(row, offset, length, matcher.row, matcher.rowOffset, matcher.rowLength)) { + if (!scannerContext.hasAnyLimit(LimitScope.BETWEEN_CELLS) || matcher.row == null) { this.countPerRow = 0; matcher.setRow(row, offset, length); } @@ -560,6 +559,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues(); } + // Setting the matcher.row = null, will mean that after the subsequent seekToNextRow() + // the heap.peek() will any way be in the next row. So the SQM.match(cell) need do + // another compareRow to say the current row is DONE + matcher.row = null; seekToNextRow(cell); break LOOP; } @@ -587,6 +590,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues(); } + // Setting the matcher.row = null, will mean that after the subsequent seekToNextRow() + // the heap.peek() will any way be in the next row. So the SQM.match(cell) need do + // another compareRow to say the current row is DONE + matcher.row = null; seekToNextRow(cell); } else if (qcode == ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_COL) { seekAsDirection(matcher.getKeyForNextColumn(cell)); @@ -603,6 +610,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner continue; case DONE: + // We are sure that this row is done and we are in the next row. + // So subsequent StoresScanner.next() call need not do another compare + // and set the matcher.row + matcher.row = null; return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues(); case DONE_SCAN: @@ -615,7 +626,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues(); } - + // Setting the matcher.row = null, will mean that after the subsequent seekToNextRow() + // the heap.peek() will any way be in the next row. So the SQM.match(cell) need do + // another compareRow to say the current row is DONE + matcher.row = null; seekToNextRow(cell); break;