From 85b73e9427e78d1b1765ca87564462c602cf3727 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Sun, 21 Oct 2018 03:18:11 +0200 Subject: [PATCH] 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. --- src/backend.c | 8 +++++++- src/stream.c | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) 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; } -- 2.39.5