From: Willy Tarreau Date: Mon, 29 Apr 2024 06:52:40 +0000 (+0200) Subject: MEDIUM: dynbuf/stream: do not allocate the buffers in the callback X-Git-Tag: v3.0-dev11~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9a27d7aa6f680f7836abaded2108b8f3bec8b30b;p=thirdparty%2Fhaproxy.git MEDIUM: dynbuf/stream: do not allocate the buffers in the callback One of the problematic designs with the buffer_wait mechanism is that the callbacks pre-allocate the buffers and stay in the run queue for a while, resulting in all of the few buffers being assigned to waiting tasks instead of being all available to one task that needs them all at once. Here we simply stop doing this, the callback clears the waiting flags and wakes the task up so that it has a chance of still finding some buffers. --- diff --git a/src/stream.c b/src/stream.c index a91cbe4a5c..693f7942af 100644 --- a/src/stream.c +++ b/src/stream.c @@ -320,14 +320,11 @@ int stream_buf_available(void *arg) { struct stream *s = arg; - if (!s->req.buf.size && !sc_ep_have_ff_data(s->scb) && s->scf->flags & SC_FL_NEED_BUFF && - b_alloc(&s->req.buf, DB_CHANNEL)) + if (!s->req.buf.size && !sc_ep_have_ff_data(s->scb) && s->scf->flags & SC_FL_NEED_BUFF) sc_have_buff(s->scf); - else if (!s->res.buf.size && !sc_ep_have_ff_data(s->scf) && s->scb->flags & SC_FL_NEED_BUFF && - b_alloc(&s->res.buf, DB_CHANNEL)) + + if (!s->res.buf.size && !sc_ep_have_ff_data(s->scf) && s->scb->flags & SC_FL_NEED_BUFF) sc_have_buff(s->scb); - else - return 0; task_wakeup(s->task, TASK_WOKEN_RES); return 1;