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:
parent
eb23e3e243
commit
dbae89e09c
@ -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 stktable *t, char *id, char *nid, struct peers *peers);
|
||||||
struct stksess *stktable_get_entry(struct stktable *table, struct stktable_key *key);
|
struct stksess *stktable_get_entry(struct stktable *table, struct stktable_key *key);
|
||||||
struct stksess *stktable_set_entry(struct stktable *table, struct stksess *nts);
|
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_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_remote(struct stktable *t, struct stksess *ts, int decrefcnt);
|
||||||
void stktable_touch_local(struct stktable *t, struct stksess *ts, int decrefccount);
|
void stktable_touch_local(struct stktable *t, struct stksess *ts, int decrefccount);
|
||||||
|
@ -378,32 +378,11 @@ void stktable_touch_with_exp(struct stktable *t, struct stksess *ts, int local,
|
|||||||
{
|
{
|
||||||
struct eb32_node * eb;
|
struct eb32_node * eb;
|
||||||
int locked = 0;
|
int locked = 0;
|
||||||
int old_exp, new_exp;
|
|
||||||
|
|
||||||
if (expire != HA_ATOMIC_LOAD(&ts->expire)) {
|
if (expire != HA_ATOMIC_LOAD(&ts->expire)) {
|
||||||
/* we'll need to set the expiration and to wake up the expiration timer .*/
|
/* we'll need to set the expiration and to wake up the expiration timer .*/
|
||||||
HA_ATOMIC_STORE(&ts->expire, expire);
|
HA_ATOMIC_STORE(&ts->expire, expire);
|
||||||
if (t->expire) {
|
stktable_requeue_exp(t, ts);
|
||||||
/* 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 */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If sync is enabled */
|
/* 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
|
/* requeues the table's expiration task to take the recently added <ts> into
|
||||||
* account. This is performed atomically and doesn't require any lock.
|
* 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)
|
if (!t->expire)
|
||||||
return;
|
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);
|
task_queue(t->exp_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user