@Override
  protected void decompressNative(ByteBuffer compressedBuffer, int compressedBufferOffset, int compressedBufferSize,
      ByteBuffer sourceDataBuffer, int sourceDataOffset, int sourceDataSize) throws CompressionException {
    // This decompressor supports all compressors, LZ4 and LZ4 HC.
    try {
      getDecompressor().decompress(compressedBuffer, compressedBufferOffset, sourceDataBuffer, sourceDataOffset,
          sourceDataSize);
    } catch (Exception ex) {
      throw new CompressionException(String.format("LZ4 decompression failed. "
              + "compressedBuffer.limit=%d, compressedBufferOffset=%d, compressedBufferSize=%d, "
              + "sourceData.capacity=%d, sourceDataOffset=%d, sourceDataSize=%d", compressedBuffer.limit(),
          compressedBufferOffset, compressedBufferSize, sourceDataBuffer.capacity(), sourceDataOffset, sourceDataSize),
          ex);
    }
  }
Invoke the LZ4 decompression algorithm given the compressedBuffer, its offset, and size.
The original data is written to the sourceDataBuffer at the specified offset and size.
The size of sourceDataBuffer must be at least the original data size.

@param compressedBuffer The compressed buffer.
@param compressedBufferOffset The offset in compressedBuffer where the decompression should start reading.
@param compressedBufferSize Size of the compressed buffer returned from compressNative().
@param sourceDataBuffer The buffer to store decompression output (the original source data).
@param sourceDataOffset Offset where to write the decompressed data.
@param sourceDataSize Size of the buffer to hold the decompressed data.  It must be size of original data.
ambry-commons/src/main/java/com/github/ambry/compression/LZ4Compression.java