diff --git a/src/backend.c b/src/backend.c index b154b8045..cbeadff0e 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1061,12 +1061,16 @@ int connect_server(struct stream *s) struct server *srv; int reuse = 0; int err; + void *send_wait = NULL, *recv_wait = NULL; srv = objt_server(s->target); srv_cs = objt_cs(s->si[1].end); srv_conn = cs_conn(srv_cs); - if (srv_conn) + if (srv_conn) { reuse = s->target == srv_conn->target; + send_wait = srv_conn->send_wait; + recv_wait = srv_conn->recv_wait; + } if (srv && !reuse) { old_cs = srv_cs; @@ -1163,6 +1167,8 @@ int connect_server(struct stream *s) LIST_DEL(&srv_conn->list); LIST_INIT(&srv_conn->list); } + srv_conn->send_wait = send_wait; + srv_conn->recv_wait = recv_wait; if (!srv_cs) return SF_ERR_RESOURCE; diff --git a/src/stream.c b/src/stream.c index 42a6c48c9..7444115a4 100644 --- a/src/stream.c +++ b/src/stream.c @@ -883,11 +883,22 @@ static void sess_update_stream_int(struct stream *s) srv = objt_server(s->target); if (conn_err == SF_ERR_NONE) { + struct connection *conn; + + conn = cs_conn(objt_cs(si->end)); /* state = SI_ST_CON or SI_ST_EST now */ if (srv) srv_inc_sess_ctr(srv); if (srv) srv_set_sess_last(srv); + /* If we're retrying to connect to the server, and + * somebody subscribed to recv or send events, we have + * to make sure the polling is active on the new fd. + */ + if (conn->send_wait) + conn_xprt_want_send(conn); + if (conn->recv_wait) + conn_xprt_want_recv(conn); return; }