diff --git a/include/haproxy/stick_table.h b/include/haproxy/stick_table.h index 2c5e7a223..3e10db107 100644 --- a/include/haproxy/stick_table.h +++ b/include/haproxy/stick_table.h @@ -220,9 +220,6 @@ static inline void stksess_kill_if_expired(struct stktable *t, struct stksess *t uint shard; size_t len; - if (decrefcnt && HA_ATOMIC_SUB_FETCH(&ts->ref_cnt, 1) != 0) - return; - if (t->expire != TICK_ETERNITY && tick_is_expired(ts->expire, now_ms)) { if (t->type == SMP_T_STR) len = strlen((const char *)ts->key.key); @@ -235,9 +232,12 @@ static inline void stksess_kill_if_expired(struct stktable *t, struct stksess *t ALREADY_CHECKED(shard); HA_RWLOCK_WRLOCK(STK_TABLE_LOCK, &t->shards[shard].sh_lock); - __stksess_kill_if_expired(t, ts); + if (!decrefcnt || !HA_ATOMIC_SUB_FETCH(&ts->ref_cnt, 1)) + __stksess_kill_if_expired(t, ts); HA_RWLOCK_WRUNLOCK(STK_TABLE_LOCK, &t->shards[shard].sh_lock); } + else if (decrefcnt) + HA_ATOMIC_SUB_FETCH(&ts->ref_cnt, 1); } /* sets the stick counter's entry pointer */ diff --git a/src/stick_table.c b/src/stick_table.c index ff19709d6..2b5eddd7b 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -170,10 +170,7 @@ int stksess_kill(struct stktable *t, struct stksess *ts, int decrefcnt) { uint shard; size_t len; - int ret; - - if (decrefcnt && HA_ATOMIC_SUB_FETCH(&ts->ref_cnt, 1) != 0) - return 0; + int ret = 0; if (t->type == SMP_T_STR) len = strlen((const char *)ts->key.key); @@ -186,7 +183,8 @@ int stksess_kill(struct stktable *t, struct stksess *ts, int decrefcnt) ALREADY_CHECKED(shard); HA_RWLOCK_WRLOCK(STK_TABLE_LOCK, &t->shards[shard].sh_lock); - ret = __stksess_kill(t, ts); + if (!decrefcnt || !HA_ATOMIC_SUB_FETCH(&ts->ref_cnt, 1)) + ret = __stksess_kill(t, ts); HA_RWLOCK_WRUNLOCK(STK_TABLE_LOCK, &t->shards[shard].sh_lock); return ret;