@Override
  public void persistTokens(String partitionPath, String tokenFileName, InputStream inputStream)
      throws CloudStorageException {
    // Path is partitionId path string
    // Write to container partitionPath, blob filename "replicaTokens"
    try {
      BlobLayout tokenLayout = blobLayoutStrategy.getTokenBlobLayout(partitionPath, tokenFileName);
      azureBlobDataAccessor.uploadFileAsync(tokenLayout.containerName, tokenLayout.blobFilePath, inputStream).join();
    } catch (Exception e) {
      azureMetrics.replicaTokenWriteErrorCount.inc();
      throw toCloudStorageException("Could not persist token: " + partitionPath, Utils.extractFutureExceptionCause(e));
    }
  }
Update the metadata for the specified blob asynchronously.
@param blobId The {@link BlobId} to update.
@param updateFields map of fields and new values to update.
@param cloudUpdateValidator {@link CloudUpdateValidator} passed by the caller to validate the update.
@return a {@link CompletableFuture} that will eventually contain either the {@link UpdateResponse} object
        containing updated metadata or an exception if an error occurred.
ambry-cloud/src/main/java/com/github/ambry/cloud/azure/AzureCloudDestination.java