From d2d3fd9b5e7cce174dbb225819855174e2e03c76 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 11 Oct 2022 15:09:46 +0200 Subject: [PATCH] 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. --- src/stick_table.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/stick_table.c b/src/stick_table.c index 92f662dfb..6f5e6c899 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -498,18 +498,23 @@ static void stktable_release(struct stktable *t, struct stksess *ts) /* Insert new sticky session 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. is returned. + * is set. 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 } /* Returns a valid or initialized stksess for the specified stktable_key in the