From: Christopher Faulet Date: Thu, 9 Feb 2023 13:14:38 +0000 (+0100) Subject: BUG/MEDIUM: stconn: Don't needlessly wake the stream on send during fast-forward X-Git-Tag: v2.8-dev4~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=71c486b290d49a0d278fc7f822dd451c31aaf144;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: stconn: Don't needlessly wake the stream on send during fast-forward With a connection, when data are received, if these data are sent to the opposite side because the fast-forwarding is possible, the stream may be woken up on some conditions (at the end of sc_app_chk_snd_conn()): * The channel is shut for write * The SC is not in the "established" state * The stream must explicitly be woken up on write and all data was sent * The connection was just established. A bug on the last condition was introduced with the commit d89884153 ("MEDIUM: channel: Use CF_WRITE_EVENT instead of CF_WRITE_PARTIAL"). The stream is now woken up on any write events. This patch fixes this issue and restores the original behavior. No backport is needed. --- diff --git a/src/stconn.c b/src/stconn.c index 48c5a50ab3..9dfd77ca32 100644 --- a/src/stconn.c +++ b/src/stconn.c @@ -870,10 +870,11 @@ static void sc_app_chk_snd_conn(struct stconn *sc) /* in case of special condition (error, shutdown, end of write...), we * have to notify the task. */ - if (likely((oc->flags & (CF_WRITE_EVENT|CF_SHUTW)) || - ((oc->flags & CF_WAKE_WRITE) && - ((channel_is_empty(oc) && !oc->to_forward) || - !sc_state_in(sc->state, SC_SB_EST))))) { + if (likely((oc->flags & CF_SHUTW) || + ((oc->flags & CF_WRITE_EVENT) && sc->state < SC_ST_EST) || + ((oc->flags & CF_WAKE_WRITE) && + ((channel_is_empty(oc) && !oc->to_forward) || + !sc_state_in(sc->state, SC_SB_EST))))) { out_wakeup: if (!(sc->flags & SC_FL_DONT_WAKE)) task_wakeup(sc_strm_task(sc), TASK_WOKEN_IO);