MEDIUM: stick-table: return inserted entry in __stktable_store()

This function is used to create an entry in the table. But it doesn't
consider the possibility that the entry already exists, because right
now it's only called in situations where it was verified under a lock
that it doesn't exist. Since we'll soon need to break that assumption
we need it to verify that the requested entry was added and to return
a pointer to the one in the tree so that the caller can detect any
possible conflict. At the moment this is not used.
This commit is contained in:
Willy Tarreau 2022-10-11 15:09:46 +02:00
parent 8d3c3336f9
commit d2d3fd9b5e
1 changed files with 10 additions and 5 deletions

View File

@ -498,18 +498,23 @@ static void stktable_release(struct stktable *t, struct stksess *ts)
/* Insert new sticky session <ts> in the table. It is assumed that it does not
* yet exist (the caller must check this). The table's timeout is updated if it
* is set. <ts> is returned.
* is set. <ts> is returned if properly inserted, otherwise the one already
* present if any.
*/
void __stktable_store(struct stktable *t, struct stksess *ts)
struct stksess *__stktable_store(struct stktable *t, struct stksess *ts)
{
struct ebmb_node *eb;
ebmb_insert(&t->keys, &ts->key, t->key_size);
ts->exp.key = ts->expire;
eb32_insert(&t->exps, &ts->exp);
eb = ebmb_insert(&t->keys, &ts->key, t->key_size);
if (likely(eb == &ts->key)) {
ts->exp.key = ts->expire;
eb32_insert(&t->exps, &ts->exp);
}
if (t->expire) {
t->exp_task->expire = t->exp_next = tick_first(ts->expire, t->exp_next);
task_queue(t->exp_task);
}
return ebmb_entry(eb, struct stksess, key); // most commonly this is <ts>
}
/* Returns a valid or initialized stksess for the specified stktable_key in the