MEDIUM: stick-table: always use atomic ops to requeue the table's task

We're generalizing the change performed in previous commit "MEDIUM:
stick-table: requeue the expiration task out of the exclusive lock"
to stktable_requeue_exp() so that it can also be used by callers of
__stktable_store(). At the moment there's still no visible change
since it's still called under the write lock. However, the previous
code in stitable_touch_with_exp() was updated to use this function.
This commit is contained in:
Willy Tarreau 2022-10-12 10:00:50 +00:00
parent eb23e3e243
commit dbae89e09c
2 changed files with 24 additions and 24 deletions

View File

@ -50,6 +50,7 @@ int parse_stick_table(const char *file, int linenum, char **args,
struct stktable *t, char *id, char *nid, struct peers *peers);
struct stksess *stktable_get_entry(struct stktable *table, struct stktable_key *key);
struct stksess *stktable_set_entry(struct stktable *table, struct stksess *nts);
void stktable_requeue_exp(struct stktable *t, const struct stksess *ts);
void stktable_touch_with_exp(struct stktable *t, struct stksess *ts, int decrefcount, int expire, int decrefcnt);
void stktable_touch_remote(struct stktable *t, struct stksess *ts, int decrefcnt);
void stktable_touch_local(struct stktable *t, struct stksess *ts, int decrefccount);

View File

@ -378,32 +378,11 @@ void stktable_touch_with_exp(struct stktable *t, struct stksess *ts, int local,
{
struct eb32_node * eb;
int locked = 0;
int old_exp, new_exp;
if (expire != HA_ATOMIC_LOAD(&ts->expire)) {
/* we'll need to set the expiration and to wake up the expiration timer .*/
HA_ATOMIC_STORE(&ts->expire, expire);
if (t->expire) {
/* set both t->exp_next and the task's expire to the newest
* expiration date.
*/
old_exp = HA_ATOMIC_LOAD(&t->exp_next);
do {
new_exp = tick_first(expire, old_exp);
} while (new_exp != old_exp &&
!HA_ATOMIC_CAS(&t->exp_next, &old_exp, new_exp) &&
__ha_cpu_relax());
old_exp = HA_ATOMIC_LOAD(&t->exp_task->expire);
do {
new_exp = HA_ATOMIC_LOAD(&t->exp_next);
} while (new_exp != old_exp &&
!HA_ATOMIC_CAS(&t->exp_task->expire, &old_exp, new_exp) &&
__ha_cpu_relax());
task_queue(t->exp_task);
/* keep the lock */
}
stktable_requeue_exp(t, ts);
}
/* If sync is enabled */
@ -516,11 +495,31 @@ struct stksess *__stktable_store(struct stktable *t, struct stksess *ts)
/* requeues the table's expiration task to take the recently added <ts> into
* account. This is performed atomically and doesn't require any lock.
*/
static void stktable_requeue_exp(struct stktable *t, const struct stksess *ts)
void stktable_requeue_exp(struct stktable *t, const struct stksess *ts)
{
int old_exp, new_exp;
int expire = ts->expire;
if (!t->expire)
return;
t->exp_task->expire = t->exp_next = tick_first(ts->expire, t->exp_next);
/* set both t->exp_next and the task's expire to the newest
* expiration date.
*/
old_exp = HA_ATOMIC_LOAD(&t->exp_next);
do {
new_exp = tick_first(expire, old_exp);
} while (new_exp != old_exp &&
!HA_ATOMIC_CAS(&t->exp_next, &old_exp, new_exp) &&
__ha_cpu_relax());
old_exp = HA_ATOMIC_LOAD(&t->exp_task->expire);
do {
new_exp = HA_ATOMIC_LOAD(&t->exp_next);
} while (new_exp != old_exp &&
!HA_ATOMIC_CAS(&t->exp_task->expire, &old_exp, new_exp) &&
__ha_cpu_relax());
task_queue(t->exp_task);
}