diff --git a/include/haproxy/connection.h b/include/haproxy/connection.h index 876f55761..2e01a2d54 100644 --- a/include/haproxy/connection.h +++ b/include/haproxy/connection.h @@ -396,7 +396,7 @@ static inline struct connection *conn_new(void *target) if (likely(conn != NULL)) { conn_init(conn, target); if (obj_type(target) == OBJ_TYPE_SERVER) - srv_use_idle_conn(__objt_server(target), conn); + srv_use_conn(__objt_server(target), conn); } return conn; } diff --git a/include/haproxy/server.h b/include/haproxy/server.h index f15b7057d..d63eb01bc 100644 --- a/include/haproxy/server.h +++ b/include/haproxy/server.h @@ -239,17 +239,8 @@ static inline enum srv_initaddr srv_get_next_initaddr(unsigned int *list) return ret; } -static inline void srv_use_idle_conn(struct server *srv, struct connection *conn) +static inline void srv_use_conn(struct server *srv, struct connection *conn) { - if (conn->flags & CO_FL_LIST_MASK) { - _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); - conn->flags &= ~CO_FL_LIST_MASK; - __ha_barrier_atomic_store(); - LIST_ADDQ(&srv->available_conns[tid], mt_list_to_list(&conn->list)); - } - _HA_ATOMIC_ADD(&srv->curr_used_conns, 1); /* It's ok not to do that atomically, we don't need an diff --git a/src/backend.c b/src/backend.c index 19bce9c19..bd841c20a 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1167,6 +1167,7 @@ static struct connection *conn_backend_get(struct server *srv, int is_safe) MT_LIST_DEL_SAFE(elt1); _HA_ATOMIC_ADD(&activity[tid].fd_takeover, 1); found = 1; + break; } } @@ -1179,6 +1180,7 @@ static struct connection *conn_backend_get(struct server *srv, int is_safe) found = 1; is_safe = 1; mt_list = srv->safe_conns; + break; } } @@ -1191,7 +1193,16 @@ static struct connection *conn_backend_get(struct server *srv, int is_safe) done: if (conn) { _HA_ATOMIC_STORE(&srv->next_takeover, (i + 1 == global.nbthread) ? 0 : i + 1); - srv_use_idle_conn(srv, conn); + + srv_use_conn(srv, 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[i], 1); + conn->flags &= ~CO_FL_LIST_MASK; + __ha_barrier_atomic_store(); + + LIST_ADDQ(&srv->available_conns[tid], mt_list_to_list(&conn->list)); } return conn; }