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.
This commit is contained in:
Olivier Houchard 2018-12-28 16:20:25 +01:00 committed by Willy Tarreau
parent 4f41751ad2
commit c685d700fd

View File

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