ts = eb32_entry(eb, struct stksess, exp);
eb = eb32_next(eb);
- /* don't delete an entry which is currently referenced */
- if (HA_ATOMIC_LOAD(&ts->ref_cnt) != 0)
- continue;
-
+ /* This entry's key is expired, we must delete it. It
+ * may be properly requeued if the element is still in
+ * use or not really expired though.
+ */
eb32_delete(&ts->exp);
- if (ts->expire != ts->exp.key) {
+ if (ts->expire != ts->exp.key || HA_ATOMIC_LOAD(&ts->ref_cnt) != 0) {
+ requeue:
if (!tick_isset(ts->expire))
continue;
* existing ones already have the ref_cnt.
*/
if (HA_ATOMIC_LOAD(&ts->ref_cnt))
- continue;
+ goto requeue;
/* session expired, trash it */
ebmb_delete(&ts->key);
ts = eb32_entry(eb, struct stksess, exp);
eb = eb32_next(eb);
- /* don't delete an entry which is currently referenced */
- if (HA_ATOMIC_LOAD(&ts->ref_cnt) != 0)
- continue;
-
if (updt_locked == 1) {
expired++;
if (expired == STKTABLE_MAX_UPDATES_AT_ONCE) {
}
}
+ /* This entry's key is expired, we must delete it. It
+ * may be properly requeued if the element is still in
+ * use or not really expired though.
+ */
eb32_delete(&ts->exp);
- if (!tick_is_expired(ts->expire, now_ms)) {
+ if (!tick_is_expired(ts->expire, now_ms) || HA_ATOMIC_LOAD(&ts->ref_cnt) != 0) {
+ requeue:
if (!tick_isset(ts->expire))
continue;
* existing ones already have the ref_cnt.
*/
if (HA_ATOMIC_LOAD(&ts->ref_cnt))
- continue;
+ goto requeue;
/* session expired, trash it */
ebmb_delete(&ts->key);