.../hbase/regionserver/ScanQueryMatcher.java | 32 ++++++++++++---------- .../hadoop/hbase/regionserver/StoreScanner.java | 8 ++++-- 2 files changed, 23 insertions(+), 17 deletions(-) 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 9c91017..c832255 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 @@ -283,23 +283,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. 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 d5c65a5..1a9b6d2 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 @@ -491,8 +491,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); } @@ -540,6 +539,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues(); } + matcher.row = null; seekToNextRow(cell); break LOOP; } @@ -567,6 +567,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues(); } + matcher.row = null; seekToNextRow(cell); } else if (qcode == ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_COL) { seekAsDirection(matcher.getKeyForNextColumn(cell)); @@ -583,6 +584,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner continue; case DONE: + matcher.row = null; return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues(); case DONE_SCAN: @@ -595,7 +597,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner if (!matcher.moreRowsMayExistAfter(cell)) { return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues(); } - + matcher.row = null; seekToNextRow(cell); break;