private IndexValue getPutValueFromDeleteEntry(StoreKey key, IndexValue deleteValue,
      IndexSegment indexSegmentOfUpdateValue) {
    // TODO: find a way to test this?
    IndexValue putValue = null;
    long putRecordOffset = deleteValue.getOriginalMessageOffset();
    if (putRecordOffset != IndexValue.UNKNOWN_ORIGINAL_MESSAGE_OFFSET && putRecordOffset != deleteValue.getOffset()
        .getOffset() && indexSegmentOfUpdateValue.getStartOffset().getOffset() <= putRecordOffset) {
      try (BlobReadOptions options = srcIndex.getBlobReadInfo(key, EnumSet.allOf(StoreGetOptions.class))) {
        Offset offset = new Offset(indexSegmentOfUpdateValue.getStartOffset().getName(), options.getOffset());
        MessageInfo info = options.getMessageInfo();
        putValue = new IndexValue(info.getSize(), offset, info.getExpirationTimeInMs(), info.getOperationTimeMs(),
            info.getAccountId(), info.getContainerId());
      } catch (StoreException e) {
        logger.error("Fetching PUT index entry of {} in {} failed", key, indexSegmentOfUpdateValue.getStartOffset());
      }
    }
    return putValue;
  }
Gets the {@link IndexValue} for the PUT using info in the {@code deleteValue)
@param key the {@link StoreKey} whose PUT is required
@param deleteValue the delete {@link IndexValue} associated with the same {@code key}
@param indexSegmentOfUpdateValue the {@link IndexSegment} that {@code deleteValue} belongs to
@return the {@link IndexValue} for the PUT in the {@link #srcIndex} (if it exists)
ambry-store/src/main/java/com/github/ambry/store/BlobStoreCompactor.java