diff --git a/include/proto/connection.h b/include/proto/connection.h index 45b8a8a53..3bfad58ef 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -698,7 +698,7 @@ static inline void conn_free(struct connection *conn) } conn_force_unsubscribe(conn); - LIST_DEL(&conn->list); + LIST_DEL_LOCKED(&conn->list); LIST_INIT(&conn->list); pool_free(pool_head_connection, conn); } diff --git a/include/proto/server.h b/include/proto/server.h index 9467f697a..82c9cbf4f 100644 --- a/include/proto/server.h +++ b/include/proto/server.h @@ -252,7 +252,7 @@ static inline int srv_add_to_idle_list(struct server *srv, struct connection *co return 0; } LIST_DEL(&conn->list); - LIST_ADDQ(&srv->idle_orphan_conns[tid], &conn->list); + LIST_ADDQ_LOCKED(&srv->idle_orphan_conns[tid], &conn->list); srv->curr_idle_thr[tid]++; conn->idle_time = now_ms; diff --git a/src/backend.c b/src/backend.c index d15020aa6..489927e92 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1307,9 +1307,12 @@ int connect_server(struct stream *s) (((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_ALWS) || (((s->be->options & PR_O_REUSE_MASK) != PR_O_REUSE_NEVR) && s->txn && (s->txn->flags & TX_NOT_FIRST)))) { - srv_conn = LIST_ELEM(srv->idle_orphan_conns[tid].n, + srv_conn = LIST_POP_LOCKED(&srv->idle_orphan_conns[tid], struct connection *, list); - reuse_orphan = 1; + if (srv_conn) { + LIST_INIT(&srv_conn->list); + reuse_orphan = 1; + } } /* If we've picked a connection from the pool, we now have to @@ -1341,7 +1344,6 @@ int connect_server(struct stream *s) * list and add it back to the idle list. */ if (reuse && reuse_orphan) { - LIST_DEL(&srv_conn->list); srv_conn->idle_time = 0; HA_ATOMIC_SUB(&srv->curr_idle_conns, 1); srv->curr_idle_thr[tid]--;