Set<BlobMatchStatus> recheck(RemoteReplicaInfo replica, MessageInfo serverBlob, MessageInfo azureBlob,
      Set<BlobMatchStatus> status) {
    BlobStore store = (BlobStore) replica.getLocalStore();
    EnumSet<StoreGetOptions> storeGetOptions = EnumSet.of(StoreGetOptions.Store_Include_Deleted,
        StoreGetOptions.Store_Include_Expired);
    MessageReadSet rdset = null;
    try {
      StoreInfo stinfo = store.get(Collections.singletonList(azureBlob.getStoreKey()), storeGetOptions);
      rdset = stinfo.getMessageReadSet();
      rdset.doPrefetch(0, 0, rdset.sizeInBytes(0));
      ByteBuf bytebuf = rdset.getPrefetchedData(0);
      MessageFormatRecord.deserializeBlobAll(new NettyByteBufDataInputStream(bytebuf), storeKeyFactory);
      return Collections.singleton(BLOB_INTACT_IN_AZURE);
    } catch (Throwable e) {
      logger.error("Failed to deserialize blob due to ", e);
      status.add(BLOB_CORRUPT_IN_AZURE);
    } finally {
      if (rdset != null && rdset.count() > 0 && rdset.getPrefetchedData(0) != null) {
        rdset.getPrefetchedData(0).release();
      }
    }
    return status;
  }
Re-check by fetching the local blob
@param replica
@param serverBlob
@param azureBlob
@return
ambry-replication/src/main/java/com/github/ambry/replication/BackupCheckerThread.java