From: Willy Tarreau Date: Tue, 9 Sep 2025 14:39:08 +0000 (+0200) Subject: MINOR: stick-table: permit stksess_new() to temporarily allocate more entries X-Git-Tag: v3.3-dev9~176 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b119280f602a2182d4ea03fafb43cc3c4ba01803;p=thirdparty%2Fhaproxy.git 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. --- 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);