From c685d700fd233b7ddd2737039af0cc50b94df3b5 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 28 Dec 2018 16:20:25 +0100 Subject: [PATCH] MEDIUM: servers: Be smarter when switching connections. When connecting to a server, and reusing a connection, always attempt to give the owner of the previous session one of its own connections, so that one session won't be responsible for too many connections. This should be backported to 1.9. --- src/backend.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/backend.c b/src/backend.c index c4711ead8..b6f08d5e7 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1245,27 +1245,20 @@ int connect_server(struct stream *s) /* We're about to use another connection, let the mux know we're * done with this one */ - if (old_conn != srv_conn || !reuse) { + if (old_conn != srv_conn && old_conn && reuse && !reuse_orphan) { + struct session *sess = srv_conn->owner; - if (srv_conn && reuse) { - struct session *sess = srv_conn->owner; - - if (sess) { - if (old_conn && - !(old_conn->flags & CO_FL_PRIVATE) && - old_conn->mux != NULL && - (old_conn->mux->avail_streams(old_conn) > 0) && - (srv_conn->mux->avail_streams(srv_conn) == 1)) { - session_unown_conn(s->sess, old_conn); - old_conn->owner = sess; - if (!session_add_conn(sess, old_conn, s->target)) { - old_conn->owner = NULL; - old_conn->mux->destroy(old_conn); - } else - session_check_idle_conn(sess, old_conn); - } + if (sess) { + if (old_conn && !(old_conn->flags & CO_FL_PRIVATE) && + old_conn->mux != NULL) { + session_unown_conn(s->sess, old_conn); + old_conn->owner = sess; + if (!session_add_conn(sess, old_conn, s->target)) { + old_conn->owner = NULL; + old_conn->mux->destroy(old_conn); + } else + session_check_idle_conn(sess, old_conn); } - } }