diff --git a/include/proto/connection.h b/include/proto/connection.h index f05a4524a..30730f0ce 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -479,6 +479,11 @@ static inline void conn_free(struct connection *conn) _HA_ATOMIC_SUB(&srv->curr_idle_conns, 1); _HA_ATOMIC_SUB(conn->flags & CO_FL_SAFE_LIST ? &srv->curr_safe_nb : &srv->curr_idle_nb, 1); _HA_ATOMIC_SUB(&srv->curr_idle_thr[tid], 1); + } else { + struct server *srv = objt_server(conn->target); + + if (srv) + _HA_ATOMIC_SUB(&srv->curr_used_conns, 1); } conn_force_unsubscribe(conn); diff --git a/include/proto/server.h b/include/proto/server.h index 575e92281..2847a8cf2 100644 --- a/include/proto/server.h +++ b/include/proto/server.h @@ -261,6 +261,7 @@ static inline int srv_add_to_idle_list(struct server *srv, struct connection *co _HA_ATOMIC_SUB(&srv->curr_idle_conns, 1); return 0; } + _HA_ATOMIC_SUB(&srv->curr_used_conns, 1); MT_LIST_DEL(&conn->list); conn->idle_time = now_ms; if (is_safe) { diff --git a/include/types/server.h b/include/types/server.h index 0ffebb475..1e5e031a7 100644 --- a/include/types/server.h +++ b/include/types/server.h @@ -230,6 +230,8 @@ struct server { unsigned int curr_idle_conns; /* Current number of orphan idling connections, both the idle and the safe lists */ unsigned int curr_idle_nb; /* Current number of connections in the idle list */ unsigned int curr_safe_nb; /* Current number of connections in the safe list */ + unsigned int curr_used_conns; /* Current number of used connections */ + unsigned int max_used_conns; /* Max number of used connections (the counter is resetted at each connection purges */ unsigned int *curr_idle_thr; /* Current number of orphan idling connections per thread */ int max_reuse; /* Max number of requests on a same connection */ struct eb32_node idle_node; /* When to next do cleanup in the idle connections */ diff --git a/src/backend.c b/src/backend.c index d500a8ae7..ccf06b817 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1350,6 +1350,14 @@ int connect_server(struct stream *s) srv_cs = NULL; } + if (srv_conn && srv) { + _HA_ATOMIC_ADD(&srv->curr_used_conns, 1); + /* It's ok not to do that atomically, we don't need an + * exact max. + */ + if (srv->max_used_conns < srv->curr_used_conns) + srv->max_used_conns = srv->curr_used_conns; + } if (!srv_conn || !sockaddr_alloc(&srv_conn->dst)) { if (srv_conn) conn_free(srv_conn);