In stksess_new(), if the table is full, we call stktable_trash_oldest()
to remove a few entries so that we have some room for a new one.
It is unlikely, but possible, that stktable_trash_oldest() will fail. If
so, just give up and do not add the new entry, instead of adding it
anyway.
Give up if stktable_trash_oldest() fails to free any entry
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);
+ if (stktable_trash_oldest(t) < 1) {
+ /*
+ * If we did not manage to purge any entry, give up.
+ */
+ HA_ATOMIC_DEC(&t->current);
+ return NULL;
+ }
}
ts = pool_alloc(t->pool);