in src/main/java/org/apache/cassandra/sidecar/utils/FileStreamer.java [145:177]
private boolean acquire(HttpResponse response, String filename, long fileLength, HttpRange range, Instant startTime,
Promise<Void> promise)
{
if (rateLimiter.tryAcquire())
return true;
long microsToWait;
if (checkRetriesExhausted(startTime))
{
LOGGER.error("Retries for acquiring permit exhausted for client {}. Instance: {}", response.remoteAddress(),
response.host());
promise.fail(new HttpException(TOO_MANY_REQUESTS.code(), "Retry exhausted"));
}
else if ((microsToWait = rateLimiter.queryEarliestAvailable(0L))
< TimeUnit.SECONDS.toMicros(config.getThrottleDelayInSeconds()))
{
microsToWait = Math.max(0, microsToWait);
LOGGER.debug("Retrying streaming after {} micros for client {}. Instance: {}", microsToWait,
response.remoteAddress(), response.host());
executorPools.service()
.setTimer(MICROSECONDS.toMillis(microsToWait),
t -> acquireAndSend(response, filename, fileLength, range, startTime, promise));
}
else
{
LOGGER.debug("Asking client {} to retry after {} micros. Instance: {}", response.remoteAddress(),
microsToWait, response.host());
response.setRetryAfterHeader(microsToWait);
promise.fail(new HttpException(TOO_MANY_REQUESTS.code(), "Ask client to retry later"));
}
return false;
}