mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-04-20 14:05:31 +00:00
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:
parent
1fddc9b7bb
commit
85b73e9427
@ -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;
|
||||
|
11
src/stream.c
11
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user