From: Willy Tarreau Date: Tue, 11 Oct 2022 13:09:46 +0000 (+0200) Subject: MEDIUM: stick-table: return inserted entry in __stktable_store() X-Git-Tag: v2.7-dev8~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d2d3fd9b5e7cce174dbb225819855174e2e03c76;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/stick_table.c b/src/stick_table.c index 92f662dfb6..6f5e6c8999 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