private BlobReadOptions getDeletedBlobReadOptions(IndexValue value, StoreKey key,
      ConcurrentSkipListMap<Offset, IndexSegment> indexSegments) throws StoreException {
    BlobReadOptions readOptions;
    IndexValue putValue =
        findKey(key, new FileSpan(getStartOffset(indexSegments), value.getOffset()), EnumSet.of(IndexEntryType.PUT),
            indexSegments);
    if (putValue != null) {
      // use the expiration time from the original value because it may have been updated
      readOptions = new BlobReadOptions(log, putValue.getOffset(),
          new MessageInfo(key, putValue.getSize(), true, value.isTtlUpdate(), false, value.getExpiresAtMs(), null,
              putValue.getAccountId(), putValue.getContainerId(), putValue.getOperationTimeInMs(),
              value.getLifeVersion()));
    } else {
      // PUT record no longer available. When the PutBlob is compacted or it's force deleted, it throws the ID_Deleted exception.
      throw new StoreException("Did not find PUT index entry for key [" + key
          + "] and the the original offset in value of the DELETE entry was [" + value.getOriginalMessageOffset() + "]",
          StoreErrorCodes.IDDeleted);
    }
    return readOptions;
  }
Gets {@link BlobReadOptions} for a deleted blob.
@param value the {@link IndexValue} of the delete index entry for the blob.
@param key the {@link StoreKey} for which {@code value} is the delete {@link IndexValue}
@param indexSegments the map of index segment start {@link Offset} to {@link IndexSegment} instances
@return the {@link BlobReadOptions} that contains the information for the given {@code id}
@throws StoreException
ambry-store/src/main/java/com/github/ambry/store/PersistentIndex.java