]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: session: Steal owner-less connections on end of transaction.
authorOlivier Houchard <ohouchard@haproxy.com>
Fri, 30 Nov 2018 16:31:52 +0000 (17:31 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 1 Dec 2018 09:47:19 +0000 (10:47 +0100)
When a transaction ends, if we want to do keepalive, and the connection we
used didn't have an owner, attach the connection to the session, so that we
don't have to destroy it, and we can reuse it later.

src/proto_http.c

index eb898a771a4f4c6a1c0092ccec1556624e05ff47..7c658d92b27b37470de6ea6e2ae005fac05befbe 100644 (file)
@@ -70,6 +70,7 @@
 #include <proto/queue.h>
 #include <proto/sample.h>
 #include <proto/server.h>
+#include <proto/session.h>
 #include <proto/stream.h>
 #include <proto/stream_interface.h>
 #include <proto/task.h>
@@ -3748,10 +3749,6 @@ void http_end_txn_clean_session(struct stream *s)
 
        /* unless we're doing keep-alive, we want to quickly close the connection
         * to the server.
-        * XXX cognet: If the connection doesn't have a owner then it may not
-        * be referenced  anywhere, just kill it now, even if it could be reused.
-        * To be revisited later when revisited later when we handle connection
-        * pools properly.
         */
        if (((s->txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_KAL) ||
            !si_conn_ready(&s->si[1]) || !srv_conn->owner) {
@@ -3842,8 +3839,12 @@ void http_end_txn_clean_session(struct stream *s)
         * We then can call si_release_endpoint() to destroy the conn_stream
         */
        if (((s->txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_KAL) ||
-           !si_conn_ready(&s->si[1]) || !srv_conn->owner)
+           !si_conn_ready(&s->si[1]))
                srv_conn = NULL;
+       else if (!srv_conn->owner) {
+               srv_conn->owner = s->sess;
+               session_add_conn(s->sess, srv_conn, s->target);
+       }
        si_release_endpoint(&s->si[1]);
 
        s->si[1].state     = s->si[1].prev_state = SI_ST_INI;