]> git.kaiwu.me - haproxy.git/commit
BUG/MEDIUM: stream: reset analyse_exp when analysers are stripped on error
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 4 Nov 2026 08:40:29 +0000 (09:40 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 5 Nov 2026 17:20:59 +0000 (18:20 +0100)
commit6c5df88df8dedc46b4958fff8d0c2a24ce8bb8b2
tree536998f083bdc3dd07fb0ca93ada2b2ffa083c53
parentc460100e6e7c57056cc4e524e4ae878c22e3632f
BUG/MEDIUM: stream: reset analyse_exp when analysers are stripped on error

When the client or the server connector reports an error or a timeout that
no analyser handled, process_stream() strips all analysers from the
corresponding channel to let the error propagate, except the flt_end one.

When this happens while an analyser was yielding with the channel's
analyse_exp timer armed (e.g. an SPOE event or a Lua action waiting on an
external party), the stripped analysers can no longer manage nor reset this
timer. If it already expired, update_exp_and_leave() refuses to clear it as
long as the AN_*_FLT_END bit is kept for the two-channel filter
synchronisation, so t->expire is set to a past date, the task is requeued in
the past and process_stream() spins in a tight loop until the watchdog kills
the worker.

The request-side retry path (http_ana.c, http_req_retry) already resets
res->analyse_exp right after the same strip; do the same on both error
propagation paths of process_stream() so that an armed analyse timer can
never survive the analysers it was armed for.

This is the first commit of the series fixing github issue #3559. It must be
backported to all stable versions
src/stream.c