mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-28 22:31:06 +01:00
BUG/MEDIUM: bwlim: Be sure to never set the analyze expiration date in past
Every time a bandwidth limitation is evaluated on a channel, the analyze expiration date is renewed, mainly based on the internal bandwidth limitation filter expiration date. However, when the filter is called while there is no data to filter, we skip all limitation computations to jump at the end of the function. At this stage, the analyze expiration date is renewed before exiting. But here the internal expiration date may be expired and not reset. To sum up, it is possible to set the analyze expiration date of a channel in the past. It is unexpected and this could lead to a loop in process_stream. To fix the issue, we just now take care to reset the internal expiration date, if needed, before exiting. This patch should fix the issue #2634. It must be backported as far as 2.8.
This commit is contained in:
parent
b0990b38f8
commit
2cb5b7dca6
@ -85,10 +85,13 @@ static int bwlim_apply_limit(struct filter *filter, struct channel *chn, unsigne
|
||||
/* Don't forward anything if there is nothing to forward or the waiting
|
||||
* time is not expired
|
||||
*/
|
||||
if (!len || (tick_isset(st->exp) && !tick_is_expired(st->exp, now_ms)))
|
||||
if (tick_isset(st->exp) && !tick_is_expired(st->exp, now_ms))
|
||||
goto end;
|
||||
|
||||
st->exp = TICK_ETERNITY;
|
||||
if (!len)
|
||||
goto end;
|
||||
|
||||
ret = len;
|
||||
if (conf->flags & BWLIM_FL_SHARED) {
|
||||
void *ptr;
|
||||
@ -177,6 +180,7 @@ static int bwlim_apply_limit(struct filter *filter, struct channel *chn, unsigne
|
||||
end:
|
||||
chn->analyse_exp = tick_first((tick_is_expired(chn->analyse_exp, now_ms) ? TICK_ETERNITY : chn->analyse_exp),
|
||||
st->exp);
|
||||
BUG_ON(tick_is_expired(chn->analyse_exp, now_ms));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user