BUG/MEDIUM: mux_pt: Only call the wake emthod if nobody subscribed to receive.
In mux_pt_io_cb(), instead of always calling the wake method, only do so
if nobody subscribed for receive. If we have a subscription, just wake the
associated tasklet up.
This should be backported to 1.9 and 2.0.
(cherry picked from commit 2ed389dc6e27257997f83e3f22cb6bf8898a2a5a)
Signed-off-by: Willy Tarreau <w@1wt.eu>
diff --git a/src/mux_pt.c b/src/mux_pt.c
index d5d939d..813c5fa 100644
--- a/src/mux_pt.c
+++ b/src/mux_pt.c
@@ -55,13 +55,15 @@
* mux_pt_io_cb() is only supposed to be called if we have no
* stream attached. However, maybe the tasklet got woken up,
* and this connection was then attached to a new stream.
- * If this happened, just call the wake method. It is probably
- * not needed, because the stream probably subscribed to
- * receive events, but that way we'll be sure the event got
- * noticed, and if we had any error on the connection, we will
- * let the stream call the detach method to destroy it.
+ * If this happened, just wake the tasklet up if anybody
+ * subscribed to receive events, and otherwise call the wake
+ * method, to make sure the event is noticed.
*/
- if (ctx->cs->data_cb->wake)
+ if (ctx->conn->recv_wait) {
+ ctx->conn->recv_wait->events &= ~SUB_RETRY_RECV;
+ tasklet_wakeup(ctx->conn->recv_wait->tasklet);
+ ctx->conn->recv_wait = NULL;
+ } else if (ctx->cs->data_cb->wake)
ctx->cs->data_cb->wake(ctx->cs);
return NULL;
}