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.
diff --git a/src/backend.c b/src/backend.c
index 657da9d..7eeed8d 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -982,10 +982,33 @@
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;