public <T> void runWithRetries(RetryPolicy policy, Consumer<Callback<T>> call, Predicate<Throwable> isRetriable, Callback<T> userCallback) {
    recursiveAsyncRetry(call, isRetriable, policy, userCallback, 0);
  }
Starts retriable function call with specific {@link RetryPolicy} and callback function.
@param policy The {@link RetryPolicy} to schedule retry.
@param call The function call that will be executed and retried with failure.
@param isRetriable user defined {@link Predicate} for retry or not when exception happen.
@param userCallback The user defined {@link Callback} to be executed after success or if all retry attempts failed.
ambry-commons/src/main/java/com/github/ambry/commons/RetryExecutor.java