code: private void retry(int attempt, Throwable error, ErrorClassification errorClassification, Context recoveryContext, SettablePromise<T> recoveryResult) {
      long backoffTime = _policy.getBackoffPolicy().nextBackoff(attempt, error);
  
      if (errorClassification == ErrorClassification.UNRECOVERABLE) {
        // For fatal errors there are no retries.
        LOGGER.debug(String.format("Attempt %s of %s interrupted: %s", attempt, _name, error.getMessage()));
        recoveryResult.fail(error);
      } else if (_policy.getTerminationPolicy().shouldTerminate(attempt, System.currentTimeMillis() - _startedAt + backoffTime)) {
        // Retry policy commands that no more retries should be done.
        LOGGER.debug(String.format("Too many exceptions after attempt %s of %s, aborting: %s", attempt, _name, error.getMessage()));
        recoveryResult.fail(error);
      } else {
        // Schedule a new retry task after a computed backoff timeout.
        LOGGER.debug(String.format("Attempt %s of %s failed and will be retried after %s millis: %s", attempt, _name, backoffTime, error.getMessage()));
        Task<T> retryTask = wrap(attempt);
        Promises.propagateResult(retryTask, recoveryResult);
        recoveryContext.createTimer(backoffTime, TimeUnit.MILLISECONDS, retryTask);
      }
    }
docs: Invoke event monitors and schedule a retry if policy allows.