MAJOR: backend: enable connection reuse

This commit allows an existing server-side connection to be reused if
it matches the same target. Basic controls are performed ; right now
we do not allow to reuse a connection when dynamic source binding is
in use or when the destination address or port is dynamic (eg: proxy
mode). Later we'll have to also disable connection sharing when PROXY
protocol is being used or when non-idempotent requests are processed.
This commit is contained in:
Willy Tarreau 2013-12-15 16:33:46 +01:00
parent 4213a11df9
commit 34601a8f98

View File

@ -982,10 +982,33 @@ static void assign_tproxy_address(struct session *s)
int connect_server(struct session *s)
{
struct connection *cli_conn;
struct connection *srv_conn = si_alloc_conn(s->req->cons, 0);
struct connection *srv_conn;
struct server *srv;
int reuse = 0;
int err;
srv_conn = objt_conn(s->req->cons->end);
if (srv_conn)
reuse = s->target == srv_conn->target;
if (reuse) {
/* Disable connection reuse if a dynamic source is used.
* As long as we don't share connections between servers,
* we don't need to disable connection reuse on no-idempotent
* requests nor when PROXY protocol is used.
*/
srv = objt_server(s->target);
if (srv && srv->conn_src.opts & CO_SRC_BIND) {
if ((srv->conn_src.opts & CO_SRC_TPROXY_MASK) == CO_SRC_TPROXY_DYN)
reuse = 0;
}
else if (s->be->conn_src.opts & CO_SRC_BIND) {
if ((s->be->conn_src.opts & CO_SRC_TPROXY_MASK) == CO_SRC_TPROXY_DYN)
reuse = 0;
}
}
srv_conn = si_alloc_conn(s->req->cons, reuse);
if (!srv_conn)
return SN_ERR_RESOURCE;