From: Willy Tarreau Date: Tue, 7 May 2024 15:52:11 +0000 (+0200) Subject: MEDIUM: channel: allocate without queuing when retrying X-Git-Tag: v3.0-dev11~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5b8d27617f4065f0a20476d6835588ff0fecd408;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/haproxy/channel.h b/include/haproxy/channel.h index 6e0c35bc75..22949e1453 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);