BUG/MEDIUM: stream: Make sure polling is right on retry.
When retrying to connect to a server, because the previous connection failed,
make sure if we subscribed to the previous connection, the polling flags will
be true for the new fd.
No backport is needed.
diff --git a/src/backend.c b/src/backend.c
index b154b80..cbeadff 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -1061,12 +1061,16 @@
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 @@
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 42a6c48..7444115 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -883,11 +883,22 @@
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;
}