private CompletableFuture<Boolean> uploadAsyncWithRetries(BlobId blobId, ByteBuffer messageBuf, long bufferSize,
      CloudBlobMetadata blobMetadata) {
    // TODO: Add retries similar to synchronous operation
    InputStream uploadInputStream = new ByteBufferInputStream(messageBuf);
    return cloudDestination.uploadBlobAsync(blobId, bufferSize, blobMetadata, uploadInputStream);
  }
Upload the supplied message buffer to a blob in the cloud destination asynchronously.
@param blobId the {@link BlobId}.
@param messageBuf the byte buffer to upload.
@param bufferSize the size of the buffer.
@param blobMetadata the {@link CloudBlobMetadata} for the blob.
@return a {@link CompletableFuture} that will eventually complete with a {@link Boolean} value indicating if the
        upload was completed or with a {@link CloudStorageException} if an error occurred.
ambry-cloud/src/main/java/com/github/ambry/cloud/CloudBlobStore.java