]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: connections: Make sure we remove CO_FL_SESS_IDLE on disown.
authorOlivier Houchard <ohouchard@haproxy.com>
Thu, 2 May 2019 10:04:15 +0000 (12:04 +0200)
committerOlivier Houchard <cognet@ci0.org>
Thu, 2 May 2019 10:08:39 +0000 (12:08 +0200)
When for some reason the session is not the owner of the connection anymore,
make sure we remove CO_FL_SESS_IDLE, even if we're about to call
conn->mux->destroy(), as the destroy may not destroy the connection
immediately if it's still in use.
This should be backported to 1.9.
u

include/proto/session.h
src/backend.c

index 2ff8e382d20d1e7a7c6723153fddf1f31215bf7a..eabebb85afc6034c2ec7323d6daff2c9c08a4b75 100644 (file)
@@ -124,12 +124,12 @@ static inline int session_check_idle_conn(struct session *sess, struct connectio
                /* We can't keep the connection, let's try to add it to the server idle list */
                session_unown_conn(sess, conn);
                conn->owner = NULL;
+               conn->flags &= ~CO_FL_SESS_IDLE;
                if (!srv_add_to_idle_list(objt_server(conn->target), conn)) {
                        /* The server doesn't want it, let's kill the connection right away */
                        conn->mux->destroy(conn->ctx);
                        return -1;
-               } else
-                       conn->flags &= ~CO_FL_SESS_IDLE;
+               }
                return 1;
        } else {
                conn->flags |= CO_FL_SESS_IDLE;
index d7695bf2ce32cc41518a24e054561a357a983c03..e41689d2a96e6ae9feeecf4965c4ee8e1ac0f658 100644 (file)
@@ -1406,6 +1406,7 @@ int connect_server(struct stream *s)
                                session_unown_conn(s->sess, old_conn);
                                old_conn->owner = sess;
                                if (!session_add_conn(sess, old_conn, old_conn->target)) {
+                                       old_conn->flags &= ~CO_FL_SESS_IDLE;
                                        old_conn->owner = NULL;
                                        old_conn->mux->destroy(old_conn->ctx);
                                } else