]> git.kaiwu.me - haproxy.git/commitdiff
WIP/MEDIUM: stktables: Use a try-lock on the updates list when removing a stksess
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 16 Oct 2025 09:35:55 +0000 (11:35 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 17 Oct 2025 14:38:54 +0000 (16:38 +0200)
src/stick_table.c

index a38a712a4c00f54b16cb5ce9add6c3eb1ce1e09d..be8d3f9998eadaba9c25c8e3a21a58dc62b518db 100644 (file)
@@ -138,7 +138,9 @@ int __stksess_kill(struct stktable *t, struct stksess *ts)
 
        /* ... and that we didn't leave the update list for the tree */
        if (MT_LIST_INLIST(&ts->upd)) {
-               link = mt_list_lock_full(&ts->upd);
+               link = mt_list_try_lock_full(&ts->upd);
+               if (link.next == NULL)
+                       goto out;
                if (HA_ATOMIC_LOAD(&ts->ref_cnt)) {
                        mt_list_unlock_full(&ts->upd, link);
                        goto out;
@@ -385,7 +387,9 @@ int stktable_trash_oldest(struct stktable *t)
                        MT_LIST_DELETE(&ts->pend_updts);
 
                        if (MT_LIST_INLIST(&ts->upd)) {
-                               link = mt_list_lock_full(&ts->upd);
+                               link = mt_list_try_lock_full(&ts->upd);
+                               if (link.next == NULL)
+                                       goto requeue;
                                if (HA_ATOMIC_LOAD(&ts->ref_cnt)) {
                                        mt_list_unlock_full(&ts->upd, link);
                                        goto requeue;
@@ -1001,7 +1005,9 @@ struct task *process_table_expire(struct task *task, void *context, unsigned int
                         */
                        MT_LIST_DELETE(&ts->pend_updts);
                        if (MT_LIST_INLIST(&ts->upd)) {
-                               link = mt_list_lock_full(&ts->upd);
+                               link = mt_list_try_lock_full(&ts->upd);
+                               if (link.next == NULL)
+                                       goto requeue;
                                if (HA_ATOMIC_LOAD(&ts->ref_cnt)) {
                                        mt_list_unlock_full(&ts->upd, link);
                                        goto requeue;