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.
This commit is contained in:
Olivier Houchard 2018-10-21 03:18:11 +02:00 committed by Willy Tarreau
parent 1fddc9b7bb
commit 85b73e9427
2 changed files with 18 additions and 1 deletions

View File

@ -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;

View File

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