void readKey(ByteBuffer in, int keyLength, int valueLength, int commonPrefix,
    CompressionState previousState) {
    this.keyLength = keyLength;
    this.valueLength = valueLength;

    // fill the state
    in.mark(); // mark beginning of key

    if (commonPrefix < KeyValue.ROW_LENGTH_SIZE) {
      rowLength = in.getShort();
      ByteBufferUtils.skip(in, rowLength);

      familyLength = in.get();

      qualifierLength = keyLength - rowLength - familyLength - KeyValue.KEY_INFRASTRUCTURE_SIZE;
      ByteBufferUtils.skip(in, familyLength + qualifierLength);
    } else {
      rowLength = previousState.rowLength;
      familyLength = previousState.familyLength;
      qualifierLength = previousState.qualifierLength + keyLength - previousState.keyLength;
      ByteBufferUtils.skip(in, (KeyValue.ROW_LENGTH_SIZE + KeyValue.FAMILY_LENGTH_SIZE) + rowLength
        + familyLength + qualifierLength);
    }

    readTimestamp(in);

    type = in.get();

    in.reset();
  }
Analyze the key and fill the state assuming we know previous state. Uses mark() and reset() in
ByteBuffer to avoid moving the position.
<p>
This method overrides all the fields of this instance, except {@link #prevOffset}, which is
usually manipulated directly by encoders and decoders.
@param in            Buffer at the position where key starts
@param keyLength     Length of key in bytes
@param valueLength   Length of values in bytes
@param commonPrefix  how many first bytes are common with previous KeyValue
@param previousState State from previous KeyValue
hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/CompressionState.java