@Override
  public boolean shouldUseScanner(Scan scan, HStore store, long oldestUnexpiredTS) {
    // if the file has no entries, no need to validate or create a scanner.
    byte[] cf = store.getColumnFamilyDescriptor().getName();
    TimeRange timeRange = scan.getColumnFamilyTimeRange().get(cf);
    if (timeRange == null) {
      timeRange = scan.getTimeRange();
    }
    return reader.passesTimerangeFilter(timeRange, oldestUnexpiredTS)
      && reader.passesKeyRangeFilter(scan)
      && reader.passesBloomFilter(scan, scan.getFamilyMap().get(cf));
  }
Pretend we have done a seek but don't do it yet, if possible. The hope is that we find
requested columns in more recent files and won't have to seek in older files. Creates a fake
key/value with the given row/column and the highest (most recent) possible timestamp we might
get from this file. When users of such "lazy scanner" need to know the next KV precisely (e.g.
when this scanner is at the top of the heap), they run {@link #enforceSeek()}.
<p>
Note that this function does guarantee that the current KV of this scanner will be advanced to
at least the given KV. Because of this, it does have to do a real seek in cases when the seek
timestamp is older than the highest timestamp of the file, e.g. when we are trying to seek to
the next row/column and use OLDEST_TIMESTAMP in the seek key.
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java