public void onResponse()

in client/src/main/java/org/apache/cassandra/sidecar/client/retry/BasicRetryPolicy.java [79:183]


    public void onResponse(CompletableFuture<HttpResponse> responseFuture,
                           Request request,
                           HttpResponse response,
                           Throwable throwable,
                           int attempts,
                           boolean canRetryOnADifferentHost,
                           RetryAction retryAction)
    {
        // throwable can be a client connection error that prevents connecting to the remote host
        if (throwable != null ||
            response.statusCode() == HttpResponseStatus.INTERNAL_SERVER_ERROR.code())
        {
            if (canRetryOnADifferentHost)
            {
                retryImmediately(responseFuture, request, response, retryAction, attempts, throwable);
            }
            else
            {
                retry(responseFuture, request, response, retryAction, attempts, throwable);
            }
            return;
        }

        if (response.statusCode() == HttpResponseStatus.OK.code() ||
            response.statusCode() == HttpResponseStatus.PARTIAL_CONTENT.code())
        {
            responseFuture.complete(response);
            return;
        }

        if (response.statusCode() == HttpResponseStatus.NOT_FOUND.code())
        {
            if (canRetryOnADifferentHost)
            {
                retryImmediately(responseFuture, request, response, retryAction, attempts);
            }
            else
            {
                logger.error("Request resource not found. response={}, attempts={}", response, attempts);
                responseFuture.completeExceptionally(new ResourceNotFoundException(request));
            }
            return;
        }

        if (response.statusCode() == HttpResponseStatus.NOT_IMPLEMENTED.code())
        {
            logger.error("Request to a not implemented endpoint. response={}, attempts={}", response, attempts);
            responseFuture.completeExceptionally(unsupportedOperation(response));
            return;
        }

        if (response.statusCode() == HttpResponseStatus.SERVICE_UNAVAILABLE.code())
        {
            if (canRetryOnADifferentHost)
            {
                retryImmediately(responseFuture, request, response, retryAction, attempts);
            }
            else
            {
                retry(responseFuture, request, response, retryAction, attempts,
                      maybeParseRetryAfterOrDefault(response, attempts), null);
            }
            return;
        }

        if (response.statusCode() == HttpResponseStatus.ACCEPTED.code())
        {
            retryAction.retry(1, retryDelayMillis(1));
            return;
        }

        if (response.statusCode() == SidecarHttpResponseStatus.CHECKSUM_MISMATCH.code())
        {
            // assume that the uploaded payload might have been corrupted, so allow for retries when an invalid
            // checksum is encountered
            if (canRetryOnADifferentHost)
            {
                retryImmediately(responseFuture, request, response, retryAction, attempts);
            }
            else
            {
                retry(responseFuture, request, response, retryAction, attempts, null);
            }
            return;
        }

        // 4xx Client Errors - 5xx Server Errors
        if (HttpStatusClass.CLIENT_ERROR.contains(response.statusCode()) ||
            HttpStatusClass.SERVER_ERROR.contains(response.statusCode()))
        {
            if (canRetryOnADifferentHost)
            {
                retryImmediately(responseFuture, request, response, retryAction, attempts);
            }
            else
            {
                logger.error("Request exhausted. response={}, attempts={}", response, attempts);
                responseFuture.completeExceptionally(RetriesExhaustedException.of(attempts, request, response));
            }
            return;
        }

        logger.error("Request encountered an unexpected status code. response={}, attempts={}", response, attempts);
        responseFuture.completeExceptionally(unexpectedStatusCode(response));
    }