public List<ChunkMetadata> getStoreKeysInByteRange(long start, long end) {
    if (end < start || start < 0L || end >= totalSize) {
      throw new IllegalArgumentException(
          "Bad input parameters, start=" + start + " end=" + end + " totalSize=" + totalSize);
    }
    int startIdx = Collections.binarySearch(offsets, start);
    //binarySearch returns -(insertion point) - 1 if not an exact match, which points to the index of
    //the first element greater than 'start', or list.size() if all elements in the list are
    // less than 'start'.
    if (startIdx < 0) {
      startIdx = -startIdx - 2; //points to element with offset closest to but less than 'start'
    }

    int endIdx = Collections.binarySearch(offsets, end);
    if (endIdx < 0) {
      endIdx = -endIdx - 2; //points to element with offset closest to but less than 'end'
    }
    endIdx++; //List.subList expects an exclusive index

    return chunkMetadataList.subList(startIdx, endIdx);
  }
Returns the keys (along with their data content size and offset relative to the total
composite blob) of the chunks related to the given byte range of the entire composite
blob
@param start inclusive starting byte index
@param end inclusive ending byte index
@return the list of {@link ChunkMetadata} that lie upon the inclusive range
between 'start' and 'end'
ambry-messageformat/src/main/java/com/github/ambry/messageformat/CompositeBlobInfo.java