Index: hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java (revision 1581038) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java (working copy) @@ -28,6 +28,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.io.hfile.CacheConfig; import org.apache.hadoop.hbase.io.hfile.HFileScanner; import org.apache.hadoop.hbase.regionserver.StoreFile; @@ -282,8 +283,13 @@ } }; } - + @Override + public boolean passesKeyRangeFilter(Scan scan) { + return true; + } + + @Override public byte[] getLastKey() { if (top) { return super.getLastKey(); Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java (revision 1581038) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java (working copy) @@ -1358,6 +1358,28 @@ return true; } + /** + * Checks whether the given scan rowkey range overlaps with the current storefile's + * @param scan the scan specification. Used to determine the rowkey range. + * @return true if there is overlap, false otherwise + */ + public boolean passesKeyRangeFilter(Scan scan) { + if (this.getFirstKey() == null || this.getLastKey() == null) { + // the file is empty + return false; + } + if (Bytes.equals(scan.getStartRow(), HConstants.EMPTY_START_ROW) + && Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW)) { + return true; + } + KeyValue startKeyValue = KeyValue.createFirstOnRow(scan.getStartRow()); + KeyValue stopKeyValue = KeyValue.createLastOnRow(scan.getStopRow()); + boolean nonOverLapping = (getComparator().compareFlatKey(this.getFirstKey(), + stopKeyValue.getKey()) > 0 && !Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW)) + || getComparator().compareFlatKey(this.getLastKey(), startKeyValue.getKey()) < 0; + return !nonOverLapping; + } + public Map loadFileInfo() throws IOException { Map fi = reader.loadFileInfo(); Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java (revision 1581038) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java (working copy) @@ -383,9 +383,8 @@ } @Override - public boolean shouldUseScanner(Scan scan, SortedSet columns, - long oldestUnexpiredTS) { - return reader.passesTimerangeFilter(scan, oldestUnexpiredTS) && - reader.passesBloomFilter(scan, columns); + public boolean shouldUseScanner(Scan scan, SortedSet columns, long oldestUnexpiredTS) { + return reader.passesTimerangeFilter(scan, oldestUnexpiredTS) + && reader.passesKeyRangeFilter(scan) && reader.passesBloomFilter(scan, columns); } }