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..0adbaf5 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 @@ -288,23 +288,31 @@ public class ScanQueryMatcher { short rowLength = Bytes.toShort(bytes, offset, Bytes.SIZEOF_SHORT); offset += Bytes.SIZEOF_SHORT; - int ret = this.rowComparator.compareRows(row, this.rowOffset, this.rowLength, - bytes, offset, rowLength); - 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 (row != null) { + int ret = this.rowComparator.compareRows(row, this.rowOffset, this.rowLength, + bytes, offset, rowLength); + if (!this.isReversed) { + if (ret <= -1) { + reset(); + 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. + reset(); + return MatchCode.SEEK_NEXT_ROW; + } + } else { + if (ret <= -1) { + reset(); + return MatchCode.SEEK_NEXT_ROW; + } else if (ret >= 1) { + reset(); + return MatchCode.DONE; + } } } else { - if (ret <= -1) { - return MatchCode.SEEK_NEXT_ROW; - } else if (ret >= 1) { - return MatchCode.DONE; - } + setRow(bytes, offset, rowLength); } // optimize case. @@ -522,19 +530,15 @@ public class ScanQueryMatcher { } } - /** - * Set current row - * @param row - */ - public void setRow(byte [] row, int offset, short length) { + private void setRow(byte [] row, int offset, short length) { checkPartialDropDeleteRange(row, offset, length); this.row = row; this.rowOffset = offset; this.rowLength = length; - reset(); } public void reset() { + this.row = null; this.deletes.reset(); this.columns.reset(); 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 e30bf59..88e0a69 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 @@ -455,15 +455,8 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner return false; } - // only call setRow if the row changes; avoids confusing the query matcher - // if scanning intra-row - byte[] row = kv.getBuffer(); - int offset = kv.getRowOffset(); - short length = kv.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); } // Only do a sanity-check if store and comparator are available. @@ -692,7 +685,6 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner matcher.rowOffset, matcher.rowLength)) { this.countPerRow = 0; matcher.reset(); - matcher.setRow(row, offset, length); } }