mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2026-03-06 15:41:36 +01:00
BUG/MEDIUM: servers: Use atomic operations when handling curr_idle_conns.
Use atomic operations when dealing with srv->curr_idle_conns, as it's shared between threads, otherwise we could get inconsistencies. This should be backported to 1.9.
This commit is contained in:
parent
67b8caefc9
commit
e737103173
@ -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);
|
||||
|
||||
@ -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])) &&
|
||||
|
||||
@ -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]);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user