mirror of
https://github.com/haproxy/haproxy.git
synced 2026-06-08 16:23:24 -04:00
BUG/MEDIUM: threads/stick-tables: close a race condition on stktable_trash_expired()
The spin_unlock() was called just before setting the expiry to TICK_ETERNITY, so if another thread has the time to perform its update and set a timeout, this would would clear it.
This commit is contained in:
parent
03071f6937
commit
4d5f13cab3
1 changed files with 3 additions and 3 deletions
|
|
@ -536,8 +536,7 @@ static int stktable_trash_expired(struct stktable *t)
|
|||
if (likely(tick_is_lt(now_ms, eb->key))) {
|
||||
/* timer not expired yet, revisit it later */
|
||||
t->exp_next = eb->key;
|
||||
SPIN_UNLOCK(STK_TABLE_LOCK, &t->lock);
|
||||
return t->exp_next;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* timer looks expired, detach it from the queue */
|
||||
|
|
@ -567,10 +566,11 @@ static int stktable_trash_expired(struct stktable *t)
|
|||
eb32_delete(&ts->upd);
|
||||
__stksess_free(t, ts);
|
||||
}
|
||||
SPIN_UNLOCK(STK_TABLE_LOCK, &t->lock);
|
||||
|
||||
/* We have found no task to expire in any tree */
|
||||
t->exp_next = TICK_ETERNITY;
|
||||
out_unlock:
|
||||
SPIN_UNLOCK(STK_TABLE_LOCK, &t->lock);
|
||||
return t->exp_next;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue