From b119280f602a2182d4ea03fafb43cc3c4ba01803 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 9 Sep 2025 16:39:08 +0200 Subject: [PATCH] MINOR: stick-table: permit stksess_new() to temporarily allocate more entries stksess_new() calls stktable_trash_oldest() to release some entries. If it fails however, it will fail to allocate an entry. This is a problem because it doesn't permit stktable_trash_oldest() to be used in best effort mode, which forces it to impose high contention. There's no problem with allocating slightly more in practice. In the worst case if all entries are in use, it's not shocking to temporarily exceed the number of entries by a few units. Let's relax this problematic rule. This patch might need to be backported to 3.2 after a bit more testing in order to support locking relaxation. --- src/stick_table.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/stick_table.c b/src/stick_table.c index a73b30a95..def13d14d 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -430,11 +430,15 @@ struct stksess *stksess_new(struct stktable *t, struct stktable_key *key) if (unlikely(current >= t->size)) { /* the table was already full, we may have to purge entries */ - if ((t->flags & STK_FL_NOPURGE) || - !stktable_trash_oldest(t, (t->size >> 8) + 1)) { + if (t->flags & STK_FL_NOPURGE) { HA_ATOMIC_DEC(&t->current); return NULL; } + /* note that it may fail to find any releasable slot due to + * locking contention but it's not a problem in practice, + * these will be recovered later. + */ + stktable_trash_oldest(t, (t->size >> 8) + 1); } ts = pool_alloc(t->pool);