private void seekBeforeAndSaveKeyToPreviousRow(ExtendedCell seekKey) throws IOException {
    if (seekCount != null) {
      seekCount.increment();
    }
    if (!hfs.seekBefore(seekKey)) {
      // Since the above seek failed, we need to position ourselves back at the start of the
      // block or else our reseek might fail. seekTo() cannot return false here as at least
      // one seekBefore will have returned true by the time we get here
      hfs.seekTo();
      this.previousRow = null;
    } else {
      this.previousRow = hfs.getKey();
    }
  }
Seeks before the seek target cell and saves the location to {@link #previousRow}. If there
doesn't exist a KV in this file before the seek target cell, reposition the scanner at the
beginning of the storefile (in preparation to a reseek at or after the seek key) and set the
{@link #previousRow} to null. If {@link #previousRow} is ever non-null and then transitions to
being null again via this method, that's because there doesn't exist a row before the seek
target in the storefile (i.e. we're at the beginning of the storefile)
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java