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.
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;
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;
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;
}