MEDIUM: stick-table: free newly allocated stkess if it couldn't be inserted

In __stktable_get_entry() now we're planning for the possibility that the
call to __stktable_store() doesn't add the newly allocated entry and instead
finds a previously inserted one. At the moment this doesn't exist because
the lookup + insert passes are made under the same lock. But it will soon
change.
This commit is contained in:
Willy Tarreau 2022-10-11 15:13:46 +02:00
parent d2d3fd9b5e
commit 175aa06232
1 changed files with 9 additions and 2 deletions

View File

@ -523,7 +523,7 @@ struct stksess *__stktable_store(struct stktable *t, struct stksess *ts)
*/
struct stksess *__stktable_get_entry(struct stktable *table, struct stktable_key *key)
{
struct stksess *ts;
struct stksess *ts, *ts2;
if (!key)
return NULL;
@ -534,7 +534,14 @@ struct stksess *__stktable_get_entry(struct stktable *table, struct stktable_key
ts = __stksess_new(table, key);
if (!ts)
return NULL;
__stktable_store(table, ts);
ts2 = __stktable_store(table, ts);
if (unlikely(ts2 != ts)) {
/* another entry was added in the mean time, let's
* switch to it.
*/
__stksess_free(table, ts);
ts = ts2;
}
}
return ts;
}