Pair<Long, Long> charge(RestRequest restRequest, long usage) {
    long quotaValue = -1L;
    long usageAfterCharge = 0L;
    try {
      Account account = RestUtils.getAccountFromArgs(restRequest.getArgs());
      Container container = RestUtils.getContainerFromArgs(restRequest.getArgs());
      QuotaResource quotaResource =
          account.getQuotaResourceType() == QuotaResourceType.ACCOUNT ? QuotaResource.fromAccount(account)
              : QuotaResource.fromContainer(container);
      quotaValue = getQuotaValueForResource(quotaResource);
      if (quotaValue != -1L) {
        AtomicLong existingUsage = new AtomicLong();
        storageUsages.compute(quotaResource, (k, v) -> {
          existingUsage.set(v == null ? 0 : v);
          if (v == null) {
            return usage;
          }
          return v + usage;
        });
        usageAfterCharge = existingUsage.addAndGet(usage);
      }
    } catch (Exception e) {
      logger.error("Failed to charge for RestRequest {}", restRequest, e);
    }
    return new Pair<>(quotaValue, usageAfterCharge);
  }
Add given {@code usage} to the current storage usage of account/container carried in {@code restRequest} even
if the result exceeds quota for the target account/container. If there is no account and container found in
{@code restRequest}, then this is a no-op. If there is no quota found for the account/container, then this is
a no-op. A {@link Pair} whose first element is quota and second element is the storage usage after charge.
@param restRequest the {@link RestRequest} that carries account and container in the header.
@param usage the usage to charge
@return A {@link Pair} whose first element is quota and second element is the storage usage after charge.
ambry-quota/src/main/java/com/github/ambry/quota/storage/StorageQuotaEnforcer.java