In assign_server_and_queue(), there's a rare case when the server was
full, so we created a pendconn, another server was considered but in the
meanwhile the pendconn was unqueued already, so we just left the
function. We did so, however, while still holding the queue lock, which
will ultimately lead to a deadlock, and ultimately the watchdog would
kill the process.
To fix that, just unlock the queue before leaving.
This should be backported to 3.2.
HA_SPIN_LOCK(QUEUE_LOCK, &p->queue->lock);
if (!p->node.node.leaf_p) {
+ HA_SPIN_UNLOCK(QUEUE_LOCK, &p->queue->lock);
/*
* Okay we've been queued and
* unqueued already, just leave