<T> void completeOperation(FutureResult<T> futureResult, Callback<T> callback, T operationResult,
      Exception exception) {
    completeOperation(futureResult, callback, operationResult, exception, true);
  }
Completes a router operation by invoking the {@code callback} and setting the {@code futureResult} with
{@code operationResult} (if any) and {@code exception} (if any).
@param <T> the type of the operation result, which depends on the kind of operation.
@param futureResult the {@link FutureResult} that needs to be set.
@param callback that {@link Callback} that needs to be invoked. Can be null.
@param operationResult the result of the operation (if any).
@param exception {@link Exception} encountered while performing the operation (if any).
ambry-router/src/main/java/com/github/ambry/router/NonBlockingRouter.java