@Override
    RouterErrorCode processServerError(ServerErrorCode errorCode) {
      logger.trace("Server returned an error: {} ", errorCode);
      RouterErrorCode resolvedRouterErrorCode;
      switch (errorCode) {
        case BlobAuthorizationFailure:
          resolvedRouterErrorCode = RouterErrorCode.BlobAuthorizationFailure;
          break;
        case BlobDeleted:
          resolvedRouterErrorCode = RouterErrorCode.BlobDeleted;
          break;
        case BlobExpired:
          resolvedRouterErrorCode = RouterErrorCode.BlobExpired;
          break;
        case BlobNotFound:
          resolvedRouterErrorCode = RouterErrorCode.BlobDoesNotExist;
          break;
        case DiskUnavailable:
        case ReplicaUnavailable:
          resolvedRouterErrorCode = RouterErrorCode.AmbryUnavailable;
          break;
        default:
          resolvedRouterErrorCode = RouterErrorCode.UnexpectedInternalError;
      }
      return resolvedRouterErrorCode;
    }
{@inheritDoc}
<br>
Receiving a {@link ServerErrorCode#BlobDeleted}, {@link ServerErrorCode#BlobExpired} or
{@link ServerErrorCode#BlobNotFound} is not unexpected for the first chunk, unlike for subsequent chunks.
ambry-router/src/main/java/com/github/ambry/router/GetBlobOperation.java