private BlobReadOptions getUndeletedBlobReadOptions(IndexValue value, StoreKey key,
      ConcurrentSkipListMap<Offset, IndexSegment> indexSegments) throws StoreException {
    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
      // since we are here dealing with undelete blob, we have to return the right life version
      return new BlobReadOptions(log, putValue.getOffset(),
          new MessageInfo(key, putValue.getSize(), false, value.isTtlUpdate(), true, value.getExpiresAtMs(), null,
              putValue.getAccountId(), putValue.getContainerId(), putValue.getOperationTimeInMs(),
              value.getLifeVersion()));
    } else {
      // PUT record no longer available.
      throw new StoreException("Did not find PUT index entry for key [" + key + "] when there is an undelete entry",
          StoreErrorCodes.IDNotFound);
    }
  }
Gets {@link BlobReadOptions} for a undeleted blob.
@param value the {@link IndexValue} of the undelete index entry for the blob.
@param key the {@link StoreKey} for which {@code value} is the undelete {@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