diff --git a/include/types/connection.h b/include/types/connection.h index 27c839f81f..bcc29650a7 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -337,6 +337,7 @@ struct mux_ops { int (*avail_streams)(struct connection *conn); /* Returns the number of streams still available for a connection */ int (*max_streams)(struct connection *conn); /* Returns the max number of streams available for that connection. */ void (*destroy)(struct connection *conn); /* Let the mux know one of its users left, so it may have to disappear */ + void (*reset)(struct connection *conn); /* Reset the mux, because we're re-trying to connect */ const struct cs_info *(*get_cs_info)(struct conn_stream *cs); /* Return info on the specified conn_stream or NULL if not defined */ unsigned int flags; /* some flags characterizing the mux's capabilities (MX_FL_*) */ char name[8]; /* mux layer name, zero-terminated */ diff --git a/src/backend.c b/src/backend.c index f494773108..34a04c35b3 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1293,7 +1293,7 @@ int connect_server(struct stream *s) return SF_ERR_INTERNAL; } - if (!conn_xprt_ready(srv_conn)) { + if (!conn_xprt_ready(srv_conn) && !srv_conn->mux) { /* the target was only on the stream, assign it to the SI now */ srv_conn->target = s->target; @@ -1361,6 +1361,10 @@ int connect_server(struct stream *s) assign_tproxy_address(s); } + else if (!conn_xprt_ready(srv_conn)) { + if (srv_conn->mux->reset) + srv_conn->mux->reset(srv_conn); + } else s->flags |= SF_SRV_REUSED; diff --git a/src/mux_h1.c b/src/mux_h1.c index da5d5c17e2..5ca3c28a0f 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -1824,6 +1824,13 @@ static struct task *h1_io_cb(struct task *t, void *ctx, unsigned short status) return NULL; } +static void h1_reset(struct connection *conn) +{ + struct h1c *h1c = conn->mux_ctx; + + /* Reset the flags, and let the mux know we're waiting for a connection */ + h1c->flags = H1C_F_CS_WAIT_CONN; +} static int h1_wake(struct connection *conn) { @@ -2171,6 +2178,7 @@ const struct mux_ops mux_h1_ops = { .unsubscribe = h1_unsubscribe, .shutr = h1_shutr, .shutw = h1_shutw, + .reset = h1_reset, .flags = MX_FL_NONE, .name = "h1", };