From: Olivier Houchard Date: Tue, 22 Jan 2019 15:11:03 +0000 (+0100) Subject: MEDIUM: servers: Used a locked list for idle_orphan_conns. X-Git-Tag: v2.0-dev2~173 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f1bc31feec82e7fde40bdff8902c2acf7fa2b3a;p=thirdparty%2Fhaproxy.git MEDIUM: servers: Used a locked list for idle_orphan_conns. Use the locked macros when manipulating idle_orphan_conns, so that other threads can remove elements from it. It will be useful later to avoid having a task per server and per thread to cleanup the orphan list. --- diff --git a/include/proto/connection.h b/include/proto/connection.h index 45b8a8a537..3bfad58ef2 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 9467f697a9..82c9cbf4f6 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 d15020aa61..489927e923 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]--;