BUG/MEDIUM: connections: Reuse an already attached conn_stream.

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.
This commit is contained in:
Olivier Houchard 2018-12-05 17:08:55 +01:00 committed by Willy Tarreau
parent 1909f6de18
commit 0fa989f4c0
1 changed files with 13 additions and 12 deletions

View 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;