From 5b8d27617f4065f0a20476d6835588ff0fecd408 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 7 May 2024 17:52:11 +0200 Subject: [PATCH] MEDIUM: channel: allocate without queuing when retrying Now when trying to allocate a channel buffer, we can check if we've been notified of availability via the producer stream connector callback, in which case we should not consult the queue, or if we're doing a first allocation and check the queue. --- include/haproxy/channel.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/haproxy/channel.h b/include/haproxy/channel.h index 6e0c35bc7..22949e145 100644 --- a/include/haproxy/channel.h +++ b/include/haproxy/channel.h @@ -915,7 +915,14 @@ static inline int ci_space_for_replace(const struct channel *chn) */ static inline int channel_alloc_buffer(struct channel *chn, struct buffer_wait *wait) { - if (b_alloc(&chn->buf, DB_CHANNEL) != NULL) + int force_noqueue; + + /* If the producer has been notified of recent availability, we must + * not check the queue again. + */ + force_noqueue = !!(chn_prod(chn)->flags & SC_FL_HAVE_BUFF); + + if (b_alloc(&chn->buf, DB_CHANNEL | (force_noqueue ? DB_F_NOQUEUE : 0)) != NULL) return 1; b_requeue(DB_CHANNEL, wait);