private boolean seekToPreviousRowWithoutHint(ExtendedCell originalKey) throws IOException {
    // Rewind to the cell before the beginning of this row
    ExtendedCell keyAtBeginningOfRow = PrivateCellUtil.createFirstOnRow(originalKey);
    if (!seekBefore(keyAtBeginningOfRow)) {
      return false;
    }

    // Rewind before this row and save what we find as a seek hint
    ExtendedCell firstKeyOfPreviousRow = PrivateCellUtil.createFirstOnRow(hfs.getKey());
    seekBeforeAndSaveKeyToPreviousRow(firstKeyOfPreviousRow);

    // Seek back to the start of the previous row
    if (!reseekAtOrAfter(firstKeyOfPreviousRow)) {
      return false;
    }

    // If after skipping newer Kvs, we're still in what we thought was the previous
    // row, then we can exit
    if (isStillAtSeekTargetAfterSkippingNewerKvs(firstKeyOfPreviousRow)) {
      return true;
    }

    // Skipping newer kvs resulted in skipping the entire row that we thought was the
    // previous row. If we've set a seek hint, then we can use that to go backwards
    // further
    if (previousRow != null) {
      return seekToPreviousRowWithHint();
    }

    // If we've made it here, then we weren't able to set a seek hint. This can happen
    // only if we're at the beginning of the storefile i.e. there is no row before this
    // one
    return false;
  }
This variant of the {@link StoreFileScanner#seekToPreviousRow(ExtendedCell)} method requires
two seeks and one reseek. The extra expense/seek is with the intent of speeding up subsequent
calls by using the {@link StoreFileScanner#seekToPreviousRowWithHint} which this method seeds
the state for by setting {@link StoreFileScanner#previousRow}
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java