From: Stefan Eissing Date: Tue, 24 Mar 2026 12:41:51 +0000 (+0100) Subject: ratelimit: reset on start X-Git-Tag: rc-8_20_0-1~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=797bc316bf24f2c0e8abf2d4f7de225c8cd24d64;p=thirdparty%2Fcurl.git ratelimit: reset on start On any `Curl_rlimit_start()` the rate limit needs to reset its values before calculating the effective step duration and adjust the tokens/burst per step. Add two fields to the struct to remember the original values. Closes #21086 --- diff --git a/lib/ratelimit.c b/lib/ratelimit.c index 2d88cdd7c9..dc013757e9 100644 --- a/lib/ratelimit.c +++ b/lib/ratelimit.c @@ -157,8 +157,8 @@ void Curl_rlimit_init(struct Curl_rlimit *r, DEBUGASSERT(rate_per_sec >= 0); DEBUGASSERT(burst_per_sec >= rate_per_sec || !burst_per_sec); DEBUGASSERT(pts); - r->rate_per_step = rate_per_sec; - r->burst_per_step = burst_per_sec; + r->rate_per_step = r->rate_per_sec = rate_per_sec; + r->burst_per_step = r->burst_per_sec = burst_per_sec; r->step_us = CURL_US_PER_SEC; r->spare_us = 0; r->tokens = r->rate_per_step; @@ -169,8 +169,13 @@ void Curl_rlimit_init(struct Curl_rlimit *r, void Curl_rlimit_start(struct Curl_rlimit *r, const struct curltime *pts, int64_t total_tokens) { - r->tokens = r->rate_per_step; + /* A start always resets the values to initial defaults, then + * fine tunes the intervals for the total_tokens expected. */ + r->rate_per_step = r->rate_per_sec; + r->burst_per_step = r->burst_per_sec; + r->step_us = CURL_US_PER_SEC; r->spare_us = 0; + r->tokens = r->rate_per_step; r->ts = *pts; rlimit_tune_steps(r, total_tokens); } diff --git a/lib/ratelimit.h b/lib/ratelimit.h index 7563734d65..3c3e38b895 100644 --- a/lib/ratelimit.h +++ b/lib/ratelimit.h @@ -55,6 +55,8 @@ struct Curl_easy; */ struct Curl_rlimit { + int64_t rate_per_sec; /* rate tokens generated per second */ + int64_t burst_per_sec; /* burst rate of tokens per second */ int64_t rate_per_step; /* rate tokens generated per step us */ int64_t burst_per_step; /* burst rate of tokens per step us */ timediff_t step_us; /* microseconds between token increases */