public CompletableFuture<Void> updateTtlAsync(List<MessageInfo> infosToUpdate) {
    try {
      checkStarted();
      // Note: We skipped uploading the blob on PUT record if the TTL was below threshold (threshold should be 0 for non DR cases).
      List<CompletableFuture<Boolean>> operationFutures = new ArrayList<>();
      for (MessageInfo msgInfo : infosToUpdate) {
        if (msgInfo.getExpirationTimeInMs() != Utils.Infinite_Time) {
          return FutureUtils.completedExceptionally(
              new StoreException("CloudBlobStore only supports removing the expiration time",
                  StoreErrorCodes.UpdateNotAllowed));
        }
        if (msgInfo.isTtlUpdated()) {
          // TODO: Add retries similar to synchronous operation
          operationFutures.add(updateTtlAsyncIfNeeded((BlobId) msgInfo.getStoreKey()));
        } else {
          logger.error("updateTtl() is called but msgInfo.isTtlUpdated is not set. msgInfo: {}", msgInfo);
          vcrMetrics.updateTtlNotSetError.inc();
        }
      }

      // Return a completable future that completes once all async TTL update operations are complete.
      return CompletableFuture.allOf(operationFutures.toArray(new CompletableFuture<?>[0]))
          .exceptionally((throwable) -> {
            unwrapCompletionExceptionAndThrowStoreException(throwable, CloudStorageException.class,
                this::mapToStoreException);
            return null;
          });
    } catch (StoreException e) {
      return FutureUtils.completedExceptionally(e);
    }
  }
Updates the TTL of all the messages in the list in the store asynchronously. When the lifeVersion is
{@link MessageInfo#LIFE_VERSION_FROM_FRONTEND}, this method is invoked by the responding to the frontend request.
Otherwise, it's invoked in the replication thread.
@param infosToUpdate The list of messages that need to be updated. Only the StoreKey, OperationTime,
                     ExpirationTime, LifeVersion should be used in this method.
@return a {@link CompletableFuture} that will eventually complete successfully when all the TTL of all messages are
        updated successfully or will contain the {@link StoreException} if an error occurred.
ambry-cloud/src/main/java/com/github/ambry/cloud/CloudBlobStore.java