private boolean retryWithReplicateBlob() {
    // it's the first time we hit the 503
    if (replicateBlobCallback == null) {
      List<ReplicaId> successfulReplica = operationTracker.getSuccessReplica();
      DataNodeId sourceDataNode = successfulReplica.get(0).getDataNodeId();
      replicateBlobCallback = new ReplicateBlobCallback(blobId, sourceDataNode);

      nonBlockingRouter.replicateBlob(blobId.getID(), this.getClass().getSimpleName(), sourceDataNode,
          replicateBlobCallback);
      LOGGER.info("Start the on-demand replication {} {} on TtlUpdateOperation.", replicateBlobCallback.getBlobId(),
          replicateBlobCallback.getSourceDataNode());
      return true;
    }

    ReplicateBlobCallback.State state = replicateBlobCallback.getState();
    switch (state) {
      case REPLICATING_BLOB:
        // Has sent out the ReplicateBlob operation and is waiting for its completion.
        LOGGER.trace("Running on-demand replication {} {}.", replicateBlobCallback.getBlobId(),
            replicateBlobCallback.getSourceDataNode());
        return true;
      case REPLICATION_DONE:
        // ReplicateBlob is done.
        // If ReplicateBlob fails, recovery procedure is done. Will complete the TtlUpdateOperation
        if (replicateBlobCallback.getException() != null) {
          LOGGER.error("on-demand replication {} {} failed.", replicateBlobCallback.getBlobId(),
              replicateBlobCallback.getSourceDataNode(), replicateBlobCallback.getException());
          return false;
        }
        // If ReplicateBlob is successful, retry the TtlUpdateOperation.
        LOGGER.info("On-demand replication {} {} is successful.", replicateBlobCallback.getBlobId(),
            replicateBlobCallback.getSourceDataNode());
        replicateBlobCallback.setState(ReplicateBlobCallback.State.RETRYING);

        // retry the TtlUpdate
        operationException.set(null);
        operationTracker =
            new SimpleOperationTracker(routerConfig, RouterOperation.TtlUpdateOperation, blobId.getPartition(),
                originatingDcName, false, routerMetrics, blobId);
        ttlUpdateRequestInfos.clear();
        return true;
      case RETRYING:
        // TtlUpdateOperation retry is finished but still failed. Nothing else we can do. Will complete the operation.
        return false;
      default:
        // code shouldn't come here
        throw new IllegalStateException("Unrecognized state type");
    }
  }
Try to replicate the blob and then retry the TtlUpdate Request
@return true if it's under retry. return false if cannot do retry or retry is finished.
ambry-router/src/main/java/com/github/ambry/router/TtlUpdateOperation.java