diff --git a/include/proto/connection.h b/include/proto/connection.h index 335757ed8..1dc0512f4 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -693,7 +693,7 @@ static inline void conn_free(struct connection *conn) */ if (conn->idle_time > 0) { struct server *srv = __objt_server(conn->target); - srv->curr_idle_conns--; + HA_ATOMIC_SUB(&srv->curr_idle_conns, 1); } conn_force_unsubscribe(conn); diff --git a/include/proto/server.h b/include/proto/server.h index fa36e8deb..51d1015e9 100644 --- a/include/proto/server.h +++ b/include/proto/server.h @@ -244,9 +244,15 @@ static inline int srv_add_to_idle_list(struct server *srv, struct connection *co !(conn->flags & CO_FL_PRIVATE) && ((srv->proxy->options & PR_O_REUSE_MASK) != PR_O_REUSE_NEVR) && !conn->mux->used_streams(conn) && conn->mux->avail_streams(conn)) { + int retadd; + + retadd = HA_ATOMIC_ADD(&srv->curr_idle_conns, 1); + if (retadd >= srv->max_idle_conns) { + HA_ATOMIC_SUB(&srv->curr_idle_conns, 1); + return 0; + } LIST_DEL(&conn->list); LIST_ADDQ(&srv->idle_orphan_conns[tid], &conn->list); - srv->curr_idle_conns++; conn->idle_time = now_ms; if (!(task_in_wq(srv->idle_task[tid])) && diff --git a/src/backend.c b/src/backend.c index 1fd66f932..3c752a273 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1343,7 +1343,7 @@ int connect_server(struct stream *s) if (reuse && reuse_orphan) { LIST_DEL(&srv_conn->list); srv_conn->idle_time = 0; - srv->curr_idle_conns--; + HA_ATOMIC_SUB(&srv->curr_idle_conns, 1); LIST_ADDQ(&srv->idle_conns[tid], &srv_conn->list); if (LIST_ISEMPTY(&srv->idle_orphan_conns[tid])) task_unlink_wq(srv->idle_task[tid]);