MEDIUM: connections: Wait until the connection is established to try to recv.
Instead of trying to receive as soon as the connection is created, and to
eventually have to transfer subscription if we move connections, wait
until the connection is established before attempting to recv.
diff --git a/src/backend.c b/src/backend.c
index 4d75df6..d402028 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -1061,16 +1061,12 @@
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;
@@ -1171,9 +1167,6 @@
if (!srv_cs)
return SF_ERR_RESOURCE;
- srv_conn->send_wait = send_wait;
- srv_conn->recv_wait = recv_wait;
-
if (!(s->flags & SF_ADDR_SET)) {
err = assign_server_address(s);
if (err != SRV_STATUS_OK)
diff --git a/src/stream.c b/src/stream.c
index f4473e8..7b601ac 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -862,6 +862,12 @@
/* real connections have timeouts */
req->wto = s->be->timeout.server;
rep->rto = s->be->timeout.server;
+ /* The connection is now established, try to read data from the
+ * underlying layer, and subscribe to recv events. We use a
+ * delayed recv here to give a chance to the data to flow back
+ * by the time we process other tasks.
+ */
+ si_chk_rcv(si);
}
req->wex = TICK_ETERNITY;
}