From: Christopher Faulet Date: Tue, 8 Jul 2025 05:46:26 +0000 (+0200) Subject: BUG/MEDIUM: http-client: Don't wake http-client applet if nothing was xferred X-Git-Tag: v3.0.12~87 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=c85b1408d222682d04fa7432904f248b4a66232f;p=haproxy-3.0.git BUG/MEDIUM: http-client: Don't wake http-client applet if nothing was xferred When data are transferred to or from the htt-pclient, the applet is systematically woken up, even when no data are transferred. This could lead to needlessly wakeups. When called from a lua script, if data are blocked for a while, this leads to a wakeup ping-pong loop where the http-client applet is woken up by the lua script which wakes back the script. To fix the issue, in httpclient_req_xfer() and httpclient_res_xfer() functions, we now take care to not wake the http-client applet up when no data are transferred. This patch must be backported as far as 2.6. (cherry picked from commit fffdac42df4848420028f89b14c2a90c12dbf9ab) Signed-off-by: Amaury Denoyelle (cherry picked from commit b35b0aaf82d625c8f78f734fb5b4c0deebd1697a) Signed-off-by: Christopher Faulet (cherry picked from commit 9dab53c6b7ba9928b61d68e5243930b1f72431f3) Signed-off-by: Christopher Faulet --- diff --git a/src/http_client.c b/src/http_client.c index 04782a1..0591404 100644 --- a/src/http_client.c +++ b/src/http_client.c @@ -377,10 +377,11 @@ int httpclient_res_xfer(struct httpclient *hc, struct buffer *dst) int ret; ret = b_force_xfer(dst, &hc->res.buf, MIN(room, b_data(&hc->res.buf))); + /* call the client once we consumed all data */ if (!b_data(&hc->res.buf)) { b_free(&hc->res.buf); - if (hc->appctx) + if (ret && hc->appctx) appctx_wakeup(hc->appctx); } return ret; @@ -409,11 +410,10 @@ int httpclient_req_xfer(struct httpclient *hc, struct ist src, int end) if (!htx) goto error; - if (hc->appctx) - appctx_wakeup(hc->appctx); - ret += htx_add_data(htx, src); + if (ret && hc->appctx) + appctx_wakeup(hc->appctx); /* if we copied all the data and the end flag is set */ if ((istlen(src) == ret) && end) {