in client/src/main/java/org/apache/cassandra/sidecar/client/retry/BasicRetryPolicy.java [78:182]
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));
}