From 8726d633d433e9937315b3a3b898706b1ebdf992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Tue, 3 May 2022 10:32:21 +0200 Subject: [PATCH] MINOR: quic: Add a debug counter for sendto() errors As we do not have any task to be wake up by the poller after sendto() error, we add an sendto() error counter to the quic_conn struct. Dump its values from qc_send_ppkts(). --- include/haproxy/xprt_quic-t.h | 1 + src/quic_sock.c | 4 ++-- src/xprt_quic.c | 6 +++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/haproxy/xprt_quic-t.h b/include/haproxy/xprt_quic-t.h index a98373394..504294f12 100644 --- a/include/haproxy/xprt_quic-t.h +++ b/include/haproxy/xprt_quic-t.h @@ -778,6 +778,7 @@ struct quic_conn { unsigned int nb_pkt_since_cc; const struct qcc_app_ops *app_ops; + unsigned int sendto_err; }; #endif /* USE_QUIC */ diff --git a/src/quic_sock.c b/src/quic_sock.c index a0f8129f4..2cc5a7f03 100644 --- a/src/quic_sock.c +++ b/src/quic_sock.c @@ -341,11 +341,11 @@ size_t qc_snd_buf(struct quic_conn *qc, const struct buffer *buf, size_t count, } else if (ret == 0 || errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOTCONN || errno == EINPROGRESS) { /* TODO must be handle properly. It is justified for UDP ? */ - ABORT_NOW(); + qc->sendto_err++; } else if (errno != EINTR) { /* TODO must be handle properly. It is justified for UDP ? */ - ABORT_NOW(); + qc->sendto_err++; } } diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 524c42d2e..ffdbe771a 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -552,7 +552,7 @@ static void quic_trace(enum trace_level level, uint64_t mask, const struct trace if (mask & QUIC_EV_CONN_SPPKTS) { const struct quic_tx_packet *pkt = a2; - chunk_appendf(&trace_buf, " cwnd=%llu ppif=%llu pif=%llu", + chunk_appendf(&trace_buf, " err=%u cwnd=%llu ppif=%llu pif=%llu", qc->sendto_err, (unsigned long long)qc->path->cwnd, (unsigned long long)qc->path->prep_in_flight, (unsigned long long)qc->path->in_flight); @@ -3180,6 +3180,7 @@ int qc_send_ppkts(struct qring *qr, struct ssl_sock_ctx *ctx) qc = ctx->qc; cbuf = qr->cbuf; + TRACE_ENTER(QUIC_EV_CONN_SPPKTS, qc); while (cb_contig_data(cbuf)) { unsigned char *pos; struct buffer tmpbuf = { }; @@ -3256,6 +3257,8 @@ int qc_send_ppkts(struct qring *qr, struct ssl_sock_ctx *ctx) } } + TRACE_LEAVE(QUIC_EV_CONN_SPPKTS, qc); + return 1; } @@ -4392,6 +4395,7 @@ static struct quic_conn *qc_new_conn(unsigned int version, int ipv4, qc->streams_by_id = EB_ROOT_UNIQUE; qc->stream_buf_count = 0; + qc->sendto_err = 0; TRACE_LEAVE(QUIC_EV_CONN_INIT, qc);