@Override
  void abort(Exception abortCause) {
    if (operationCallbackInvoked.compareAndSet(false, true)) {
      nonBlockingRouter.completeOperation(null, getOperationCallback, null, abortCause);
    } else {
      setOperationException(abortCause);
      if (blobDataChannel != null && blobDataChannel.isReadCalled()) {
        blobDataChannel.completeRead();
      }
    }
    if (shouldDeleteMetadata(abortCause)) {
      deleteMetadata(((RouterException) abortCause).getErrorCode().toString());
    }
    setOperationCompleted();
  }
{@inheritDoc}
<br>
If the callback for the operation was already called, then abort the reads from the channel and the caller
will be notified as part of the read callback eventually. If not, the notification will happen as part of the
operation completion callback.
ambry-router/src/main/java/com/github/ambry/router/GetBlobOperation.java