void completeGetBlobOperation(RouterException routerException, GetBlobOptionsInternal internalOptions,
      FutureResult<GetBlobResult> futureResult, Callback<GetBlobResult> callback, boolean isEncrypted) {
    routerMetrics.operationDequeuingRate.mark();
    routerMetrics.onGetBlobError(routerException, internalOptions, isEncrypted);
    completeOperation(futureResult, callback, null, routerException);
  }
Completes a getBlob operation by invoking the {@code callback} and setting the {@code futureResult} with the given
{@code {@link RouterException}}
@param routerException {@link RouterException} to be set in the callback and future result
@param internalOptions instance of {@link GetBlobOptionsInternal} to use
@param futureResult the {@link FutureResult} that needs to be set.
@param callback that {@link Callback} that needs to be invoked. Can be null.
@param isEncrypted {@code true} if the blob is encrypted, {@code false} otherwise
ambry-router/src/main/java/com/github/ambry/router/NonBlockingRouter.java