mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 15:47:01 +02:00
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.
This commit is contained in:
parent
479c9fb067
commit
fffdac42df
@ -179,10 +179,11 @@ int httpclient_res_xfer(struct httpclient *hc, struct buffer *dst)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = b_force_xfer(dst, &hc->res.buf, MIN(room, b_data(&hc->res.buf)));
|
ret = b_force_xfer(dst, &hc->res.buf, MIN(room, b_data(&hc->res.buf)));
|
||||||
|
|
||||||
/* call the client once we consumed all data */
|
/* call the client once we consumed all data */
|
||||||
if (!b_data(&hc->res.buf)) {
|
if (!b_data(&hc->res.buf)) {
|
||||||
b_free(&hc->res.buf);
|
b_free(&hc->res.buf);
|
||||||
if (hc->appctx)
|
if (ret && hc->appctx)
|
||||||
appctx_wakeup(hc->appctx);
|
appctx_wakeup(hc->appctx);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -211,11 +212,10 @@ int httpclient_req_xfer(struct httpclient *hc, struct ist src, int end)
|
|||||||
if (!htx)
|
if (!htx)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (hc->appctx)
|
|
||||||
appctx_wakeup(hc->appctx);
|
|
||||||
|
|
||||||
ret += htx_add_data(htx, src);
|
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 we copied all the data and the end flag is set */
|
||||||
if ((istlen(src) == ret) && end) {
|
if ((istlen(src) == ret) && end) {
|
||||||
|
Loading…
Reference in New Issue
Block a user