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.
This commit is contained in:
Willy Tarreau 2024-05-07 17:52:11 +02:00
parent b5714b45e8
commit 5b8d27617f

View File

@ -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);