From: Amaury Denoyelle Date: Tue, 28 Feb 2023 14:11:26 +0000 (+0100) Subject: MINOR: quic: notify on send ready X-Git-Tag: v2.8-dev5~68 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=caa16549b81baca7426ed838a8a94b4cc5c441fe;p=thirdparty%2Fhaproxy.git MINOR: quic: notify on send ready This patch completes the previous one with poller subscribe of quic-conn owned socket on sendto() error. This ensures that mux-quic is notified if waiting on sending when a transient sendto() error is cleared. As such, qc_notify_send() is called directly inside socket I/O callback. qc_notify_send() internal condition have been thus completed. This will prevent to notify upper layer until all sending condition are fulfilled: room in congestion window and no transient error on socket FD. This should be backported up to 2.7. --- diff --git a/src/mux_quic.c b/src/mux_quic.c index a1cb667170..cce191bd74 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -1603,8 +1603,13 @@ static int qc_send_frames(struct qcc *qcc, struct list *frms) goto err; } - if (!qc_send_mux(qcc->conn->handle.qc, frms)) + if (!qc_send_mux(qcc->conn->handle.qc, frms)) { + /* TODO should subscribe only for a transient send error */ + TRACE_DEVEL("error on send, subscribing", QMUX_EV_QCC_SEND, qcc->conn); + qcc->conn->xprt->subscribe(qcc->conn, qcc->conn->xprt_ctx, + SUB_RETRY_SEND, &qcc->wait_event); goto err; + } /* If there is frames left at this stage, transport layer is blocked. * Subscribe on it to retry later. diff --git a/src/quic_conn.c b/src/quic_conn.c index 1021bb130b..4639e67a0a 100644 --- a/src/quic_conn.c +++ b/src/quic_conn.c @@ -7809,7 +7809,8 @@ void qc_notify_close(struct quic_conn *qc) int qc_notify_send(struct quic_conn *qc) { if (qc->subs && qc->subs->events & SUB_RETRY_SEND) { - if (quic_path_prep_data(qc->path)) { + if (quic_path_prep_data(qc->path) && + (!qc_test_fd(qc) || !fd_send_active(qc->fd))) { tasklet_wakeup(qc->subs->tasklet); qc->subs->events &= ~SUB_RETRY_SEND; if (!qc->subs->events) diff --git a/src/quic_sock.c b/src/quic_sock.c index 8c99a76a68..fa2eb3d822 100644 --- a/src/quic_sock.c +++ b/src/quic_sock.c @@ -496,6 +496,7 @@ static void quic_conn_sock_fd_iocb(int fd) TRACE_DEVEL("send ready", QUIC_EV_CONN_RCV, qc); fd_stop_send(fd); tasklet_wakeup_after(NULL, qc->wait_event.tasklet); + qc_notify_send(qc); } if (fd_recv_ready(fd)) {