From: Olivier Houchard Date: Sun, 21 Oct 2018 01:18:11 +0000 (+0200) Subject: BUG/MEDIUM: stream: Make sure polling is right on retry. X-Git-Tag: v1.9-dev4~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85b73e9;p=thirdparty%2Fhaproxy.git 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 b154b80457..cbeadff0ef 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 42a6c48c97..7444115a47 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; }