@Override
  public boolean seekToPreviousRow(ExtendedCell cell) throws IOException {
    if (closed) {
      return false;
    }
    boolean keepSeeking;
    Cell key = cell;
    do {
      ExtendedCell firstKeyOnRow = PrivateCellUtil.createFirstOnRow(key);
      SortedSet<ExtendedCell> cellHead = segment.headSet(firstKeyOnRow);
      Cell lastCellBeforeRow = cellHead.isEmpty() ? null : cellHead.last();
      if (lastCellBeforeRow == null) {
        current = null;
        return false;
      }
      ExtendedCell firstKeyOnPreviousRow = PrivateCellUtil.createFirstOnRow(lastCellBeforeRow);
      this.stopSkippingKVsIfNextRow = true;
      this.stopSkippingKVsRow = firstKeyOnPreviousRow;
      seek(firstKeyOnPreviousRow);
      this.stopSkippingKVsIfNextRow = false;
      if (
        peek() == null || segment.getComparator().compareRows(peek(), firstKeyOnPreviousRow) > 0
      ) {
        keepSeeking = true;
        key = firstKeyOnPreviousRow;
        continue;
      } else {
        keepSeeking = false;
      }
    } while (keepSeeking);
    return true;
  }
Seek the scanner at the first Cell of the row which is the previous row of specified key
@param cell seek value
@return true if the scanner at the first valid Cell of previous row, false if not existing such
        Cell
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SegmentScanner.java