]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: connections: Reuse an already attached conn_stream.
authorOlivier Houchard <ohouchard@haproxy.com>
Wed, 5 Dec 2018 16:08:55 +0000 (17:08 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 6 Dec 2018 14:06:19 +0000 (15:06 +0100)
In connect_server(), if we already have a conn_stream, reuse it
instead of trying to create a new one. http_proxy and LUA both
manually create a conn_stream and a connection, and we want
to use it.

src/backend.c

index e62a3b8347c17cd8aa4e3088cec2a4864dde8489..9276fa6b212b5c1440ae3a21f9f5f2db601622d0 100644 (file)
@@ -1123,7 +1123,16 @@ int connect_server(struct stream *s)
        int i;
 
 
-       if (!(s->be->options & PR_O_HTTP_PROXY)) {
+       /* Some, such as http_proxy and the LUA, create their connection and
+        * conn_stream manually, so if we already have a conn_stream, try
+        * to use it.
+        */
+       srv_cs = objt_cs(s->si[1].end);
+       if (srv_cs) {
+               old_conn = srv_conn = cs_conn(srv_cs);
+               if (old_conn)
+                       reuse = 1;
+       } else {
                for (i = 0; i < MAX_SRV_LIST; i++) {
                        if (s->sess->srv_list[i].target == s->target) {
                                list_for_each_entry(srv_conn, &s->sess->srv_list[i].list,
@@ -1145,16 +1154,6 @@ int connect_server(struct stream *s)
                                }
                        }
                }
-       } else {
-               /* http_proxy is special, we can't just reuse any connection,
-                * as the destination may be different. We should have created
-                * a connection and a conn_stream earlier, so get the
-                * connection from the conn_stream.
-                */
-               srv_cs = objt_cs(s->si[1].end);
-               old_conn = srv_conn = cs_conn(srv_cs);
-               if (old_conn)
-                       reuse = 1;
        }
        old_conn = srv_conn;
 
@@ -1313,7 +1312,9 @@ int connect_server(struct stream *s)
                    srv->mux_proto))
 #endif
                {
-                       srv_cs = si_alloc_cs(&s->si[1], srv_conn);
+                       srv_cs = objt_cs(s->si[1].end);
+                       if (!srv_cs || srv_cs->conn != srv_conn)
+                               srv_cs = si_alloc_cs(&s->si[1], srv_conn);
                        if (!srv_cs) {
                                conn_free(srv_conn);
                                return SF_ERR_RESOURCE;