@Override
  public Future<Void> deleteBlob(RestRequest restRequest, String blobId, String serviceId, Callback<Void> callback,
      QuotaChargeCallback quotaChargeCallback) {
    FutureResult<Void> futureResult = new FutureResult<>();
    if (!handlePrechecks(futureResult, callback)) {
      return futureResult;
    }
    if (restRequest == null) {
      proceedWithDelete(blobId, serviceId, callback, futureResult);
    } else {
      try {
        String blobIdStr = getRequestPath(restRequest).getOperationOrBlobId(true);

        // Call idConverter to get blobId asynchronously
        idConverter.convert(restRequest, blobIdStr, null, new Callback<String>() {
          @Override
          public void onCompletion(String convertedBlobId, Exception exception) {
            if (exception != null) {
              // Handle error in conversion
              callback.onCompletion(null, exception);
            } else {
              List<String> blobIds = Arrays.stream(convertedBlobId.split(",")).collect(Collectors.toList());
              List<FutureResult<Void>> futures = new ArrayList<>();
              for (String blobId : blobIds) {
                FutureResult<Void> futureResult = new FutureResult<>();
                proceedWithDelete(blobId, serviceId, null, futureResult);
                futures.add(futureResult);
              }
              for (FutureResult<Void> future : futures) {
                try {
                  future.get();
                } catch (Exception e) {
                  // Handle error in delete operation
                  RouterException routerException = Utils.getRootCause(e, RouterException.class);
                  if (routerException == null) {
                    routerException = new RouterException(e, RouterErrorCode.UnexpectedInternalError);
                  }
                  callback.onCompletion(null, routerException);
                  return;
                }
              }
              callback.onCompletion(null, null);
            }
          }
        });
      } catch (Exception e) {
        // Handle synchronous errors during header extraction
        callback.onCompletion(null, e);
        return futureResult;
      }
    }
    // Blob ID is not available, use idConverter to get it
    return futureResult;
  }
Set the lifeVersion of this blob.
@param lifeVersion The lifeVersion to set.
ambry-test-utils/src/main/java/com/github/ambry/router/InMemoryRouter.java