protected void decodeTags() {
   current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);
   if (tagCompressionContext != null) {
     if (current.uncompressTags) {
       // Tag compression is been used. uncompress it into tagsBuffer
       current.ensureSpaceForTags();
       try {
         current.tagsCompressedLength =
             tagCompressionContext.uncompressTags(
                 currentBuffer, current.tagsBuffer, 0, current.tagsLength);
       } catch (IOException e) {
         throw new RuntimeException("Exception while uncompressing tags", e);
       }
     } else {
       currentBuffer.skip(current.tagsCompressedLength);
       current.uncompressTags = true; // Reset this.
     }
     current.tagsOffset = -1;
   } else {
     // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.
     // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()
     current.tagsOffset = currentBuffer.position();
     currentBuffer.skip(current.tagsLength);
   }
 }
    private void moveToPrevious() {
      if (!previous.isValid()) {
        throw new IllegalStateException(
            "Can move back only once and not in first key in the block.");
      }

      STATE tmp = previous;
      previous = current;
      current = tmp;

      // move after last key value
      currentBuffer.position(current.nextKvOffset);
      // Already decoded the tag bytes. We cache this tags into current state and also the total
      // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode
      // the tags again. This might pollute the Data Dictionary what we use for the compression.
      // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip
      // 'tagsCompressedLength' bytes of source stream.
      // See in decodeTags()
      current.tagsBuffer = previous.tagsBuffer;
      current.tagsCompressedLength = previous.tagsCompressedLength;
      current.uncompressTags = false;
      // The current key has to be reset with the previous Cell
      current.setKey(current.keyBuffer, current.memstoreTS);
      previous.invalidate();
    }