mirror of
https://github.com/NixOS/nix
synced 2025-06-25 19:01:16 +02:00
Merge pull request #13052 from rhendric/rhendric/increase-429-delay
libstore: increase retry delay for 429
This commit is contained in:
commit
15fa95f925
2 changed files with 13 additions and 4 deletions
|
@ -33,6 +33,9 @@ using namespace std::string_literals;
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
const unsigned int RETRY_TIME_MS_DEFAULT = 250;
|
||||||
|
const unsigned int RETRY_TIME_MS_TOO_MANY_REQUESTS = 60000;
|
||||||
|
|
||||||
FileTransferSettings fileTransferSettings;
|
FileTransferSettings fileTransferSettings;
|
||||||
|
|
||||||
static GlobalConfig::Register rFileTransferSettings(&fileTransferSettings);
|
static GlobalConfig::Register rFileTransferSettings(&fileTransferSettings);
|
||||||
|
@ -399,6 +402,8 @@ struct curlFileTransfer : public FileTransfer
|
||||||
{
|
{
|
||||||
auto finishTime = std::chrono::steady_clock::now();
|
auto finishTime = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
auto retryTimeMs = request.baseRetryTimeMs;
|
||||||
|
|
||||||
auto httpStatus = getHTTPStatus();
|
auto httpStatus = getHTTPStatus();
|
||||||
|
|
||||||
debug("finished %s of '%s'; curl status = %d, HTTP status = %d, body = %d bytes, duration = %.2f s",
|
debug("finished %s of '%s'; curl status = %d, HTTP status = %d, body = %d bytes, duration = %.2f s",
|
||||||
|
@ -449,10 +454,12 @@ struct curlFileTransfer : public FileTransfer
|
||||||
} else if (httpStatus == 401 || httpStatus == 403 || httpStatus == 407) {
|
} else if (httpStatus == 401 || httpStatus == 403 || httpStatus == 407) {
|
||||||
// Don't retry on authentication/authorization failures
|
// Don't retry on authentication/authorization failures
|
||||||
err = Forbidden;
|
err = Forbidden;
|
||||||
} else if (httpStatus >= 400 && httpStatus < 500 && httpStatus != 408 && httpStatus != 429) {
|
} else if (httpStatus == 429) {
|
||||||
|
// 429 means too many requests, so we retry (with a substantially longer delay)
|
||||||
|
retryTimeMs = RETRY_TIME_MS_TOO_MANY_REQUESTS;
|
||||||
|
} else if (httpStatus >= 400 && httpStatus < 500 && httpStatus != 408) {
|
||||||
// Most 4xx errors are client errors and are probably not worth retrying:
|
// Most 4xx errors are client errors and are probably not worth retrying:
|
||||||
// * 408 means the server timed out waiting for us, so we try again
|
// * 408 means the server timed out waiting for us, so we try again
|
||||||
// * 429 means too many requests, so we retry (with a delay)
|
|
||||||
err = Misc;
|
err = Misc;
|
||||||
} else if (httpStatus == 501 || httpStatus == 505 || httpStatus == 511) {
|
} else if (httpStatus == 501 || httpStatus == 505 || httpStatus == 511) {
|
||||||
// Let's treat most 5xx (server) errors as transient, except for a handful:
|
// Let's treat most 5xx (server) errors as transient, except for a handful:
|
||||||
|
@ -518,7 +525,7 @@ struct curlFileTransfer : public FileTransfer
|
||||||
|| writtenToSink == 0
|
|| writtenToSink == 0
|
||||||
|| (acceptRanges && encoding.empty())))
|
|| (acceptRanges && encoding.empty())))
|
||||||
{
|
{
|
||||||
int ms = request.baseRetryTimeMs * std::pow(2.0f, attempt - 1 + std::uniform_real_distribution<>(0.0, 0.5)(fileTransfer.mt19937));
|
int ms = retryTimeMs * std::pow(2.0f, attempt - 1 + std::uniform_real_distribution<>(0.0, 0.5)(fileTransfer.mt19937));
|
||||||
if (writtenToSink)
|
if (writtenToSink)
|
||||||
warn("%s; retrying from offset %d in %d ms", exc.what(), writtenToSink, ms);
|
warn("%s; retrying from offset %d in %d ms", exc.what(), writtenToSink, ms);
|
||||||
else
|
else
|
||||||
|
|
|
@ -58,6 +58,8 @@ struct FileTransferSettings : Config
|
||||||
|
|
||||||
extern FileTransferSettings fileTransferSettings;
|
extern FileTransferSettings fileTransferSettings;
|
||||||
|
|
||||||
|
extern const unsigned int RETRY_TIME_MS_DEFAULT;
|
||||||
|
|
||||||
struct FileTransferRequest
|
struct FileTransferRequest
|
||||||
{
|
{
|
||||||
std::string uri;
|
std::string uri;
|
||||||
|
@ -67,7 +69,7 @@ struct FileTransferRequest
|
||||||
bool head = false;
|
bool head = false;
|
||||||
bool post = false;
|
bool post = false;
|
||||||
size_t tries = fileTransferSettings.tries;
|
size_t tries = fileTransferSettings.tries;
|
||||||
unsigned int baseRetryTimeMs = 250;
|
unsigned int baseRetryTimeMs = RETRY_TIME_MS_DEFAULT;
|
||||||
ActivityId parentAct;
|
ActivityId parentAct;
|
||||||
bool decompress = true;
|
bool decompress = true;
|
||||||
std::optional<std::string> data;
|
std::optional<std::string> data;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue