Repository: hbase Updated Branches: refs/heads/branch-1.0 fd55483bc -> a55842a0a
HBASE-14221 - Reduce the number of time row comparison is done in a Scan (Ram) Conflicts: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/cccf8e6a Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/cccf8e6a Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/cccf8e6a Branch: refs/heads/branch-1.0 Commit: cccf8e6a4a791aa94e738f42370b4f7e1f90353a Parents: 5d854d3 Author: ramkrishna <ramkrishna.s.vasude...@gmail.com> Authored: Fri Jan 8 13:58:52 2016 +0530 Committer: ramkrishna <ramkrishna.s.vasude...@gmail.com> Committed: Fri Jan 8 14:02:39 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/cccf8e6a/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/cccf8e6a/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 94e94d8..b983b12 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 @@ -474,8 +474,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner byte[] row = cell.getRowArray(); int offset = cell.getRowOffset(); short length = cell.getRowLength(); - if (limit < 0 || matcher.row == null || !Bytes.equals(row, offset, length, matcher.row, - matcher.rowOffset, matcher.rowLength)) { + if (limit < 0 || matcher.row == null) { this.countPerRow = 0; matcher.setRow(row, offset, length); } @@ -512,6 +511,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return false; } + // 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; } @@ -532,6 +535,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return false; } + // 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)); @@ -545,6 +552,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 true; case DONE_SCAN: @@ -557,7 +568,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return false; } - + // 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;