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.
This commit is contained in:
Willy Tarreau 2025-09-09 16:39:08 +02:00
parent 0f33a55171
commit b119280f60

View File

@ -430,11 +430,15 @@ struct stksess *stksess_new(struct stktable *t, struct stktable_key *key)
if (unlikely(current >= t->size)) { if (unlikely(current >= t->size)) {
/* the table was already full, we may have to purge entries */ /* the table was already full, we may have to purge entries */
if ((t->flags & STK_FL_NOPURGE) || if (t->flags & STK_FL_NOPURGE) {
!stktable_trash_oldest(t, (t->size >> 8) + 1)) {
HA_ATOMIC_DEC(&t->current); HA_ATOMIC_DEC(&t->current);
return NULL; 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); ts = pool_alloc(t->pool);