mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-04-10 03:02:28 +00:00
BUG/MAJOR: threads/queue: avoid recursive locking in pendconn_get_next_strm()
pendconn_get_next_strm() is called from process_srv_queue() under the server lock, and calls stream_add_srv_conn() with this lock held, while the latter tries to take it again. This results in a deadlock when a server's maxconn is reached and haproxy is built with thread support.
This commit is contained in:
parent
95c4e14d0c
commit
103e5663c8
@ -296,11 +296,16 @@ static void inline stream_inc_http_err_ctr(struct stream *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void inline __stream_add_srv_conn(struct stream *sess, struct server *srv)
|
||||||
|
{
|
||||||
|
sess->srv_conn = srv;
|
||||||
|
LIST_ADD(&srv->actconns, &sess->by_srv);
|
||||||
|
}
|
||||||
|
|
||||||
static void inline stream_add_srv_conn(struct stream *sess, struct server *srv)
|
static void inline stream_add_srv_conn(struct stream *sess, struct server *srv)
|
||||||
{
|
{
|
||||||
HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
|
HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
|
||||||
sess->srv_conn = srv;
|
__stream_add_srv_conn(sess, srv);
|
||||||
LIST_ADD(&srv->actconns, &sess->by_srv);
|
|
||||||
HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
|
HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ static struct stream *pendconn_get_next_strm(struct server *srv, struct proxy *p
|
|||||||
/* we want to note that the stream has now been assigned a server */
|
/* we want to note that the stream has now been assigned a server */
|
||||||
strm->flags |= SF_ASSIGNED;
|
strm->flags |= SF_ASSIGNED;
|
||||||
strm->target = &srv->obj_type;
|
strm->target = &srv->obj_type;
|
||||||
stream_add_srv_conn(strm, srv);
|
__stream_add_srv_conn(strm, srv);
|
||||||
HA_ATOMIC_ADD(&srv->served, 1);
|
HA_ATOMIC_ADD(&srv->served, 1);
|
||||||
HA_ATOMIC_ADD(&srv->proxy->served, 1);
|
HA_ATOMIC_ADD(&srv->proxy->served, 1);
|
||||||
if (px->lbprm.server_take_conn)
|
if (px->lbprm.server_take_conn)
|
||||||
|
Loading…
Reference in New Issue
Block a user