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:
Olivier Houchard 2019-02-15 18:49:15 +01:00 committed by Willy Tarreau
parent 67b8caefc9
commit e737103173
3 changed files with 9 additions and 3 deletions

View File

@ -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);

View File

@ -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])) &&

View File

@ -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]);