mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-20 21:31:28 +02:00
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:
parent
0f33a55171
commit
b119280f60
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user