private Callback<Void> routerCallback(BlobId convertedBlobId) {
      return buildCallback(metrics.updateBlobTtlRouterMetrics, result -> {
        if (RequestPath.matchesOperation(blobIdStr, Operations.NAMED_BLOB)) {
          // Set the named blob state to be 'READY' after the Ttl update succeed
          if (!restRequest.getArgs().containsKey(NAMED_BLOB_VERSION)) {
            throw new RestServiceException(
                "Internal key " + NAMED_BLOB_VERSION + " is required in Named Blob TTL update callback!",
                RestServiceErrorCode.InternalServerError);
          }
          long namedBlobVersion = (long) restRequest.getArgs().get(NAMED_BLOB_VERSION);
          NamedBlobPath namedBlobPath = NamedBlobPath.parse(blobIdStr, restRequest.getArgs());
          NamedBlobRecord record = new NamedBlobRecord(namedBlobPath.getAccountName(), namedBlobPath.getContainerName(),
              namedBlobPath.getBlobName(), convertedBlobId.getID(), Utils.Infinite_Time, namedBlobVersion);
          CallbackUtils.callCallbackAfter(namedBlobDb.updateBlobTtlAndStateToReady(record),
              updateNamedBlobTtlCallback());
        } else {
          processResponseHelper();
        }
      }, restRequest.getUri(), LOGGER, finalCallback);
    }
After {@link Router#updateBlobTtl} finishes, call {@link SecurityService#processResponse}.
@param convertedBlobId the {@link BlobId} to update
@return a {@link Callback} to be used with {@link Router#updateBlobTtl}.
ambry-frontend/src/main/java/com/github/ambry/frontend/TtlUpdateHandler.java