From 1d9f170eddd8703ba550e91322298e88e8280075 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Mon, 24 Oct 2022 10:03:33 +0200 Subject: [PATCH] MINOR: quic: do not crash on unhandled sendto error Remove ABORT_NOW() statement on unhandled sendto error. Instead use a dedicated counter sendto_err_unknown to report these cases. If we detect increment of this counter, strace can be used to detect errno value : $ strace -p $(pidof haproxy) -f -e trace=sendto -Z This should be backported up to 2.6. This should help to debug github issue #1903. --- include/haproxy/quic_stats-t.h | 1 + src/quic_sock.c | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/haproxy/quic_stats-t.h b/include/haproxy/quic_stats-t.h index 8a682285c..707825e4a 100644 --- a/include/haproxy/quic_stats-t.h +++ b/include/haproxy/quic_stats-t.h @@ -56,6 +56,7 @@ struct quic_counters { long long dropped_parsing; /* total number of dropped packets upon parsing errors */ long long socket_full; /* total number of EAGAIN errors on sendto() calls */ long long sendto_err; /* total number of errors on sendto() calls, EAGAIN excepted */ + long long sendto_err_unknown; /* total number of errors on sendto() calls which are currently not supported */ long long lost_pkt; /* total number of lost packets */ long long too_short_initial_dgram; /* total number of too short datagrams with Initial packets */ long long retry_sent; /* total number of Retry sent */ diff --git a/src/quic_sock.c b/src/quic_sock.c index 861748920..29f30ccbe 100644 --- a/src/quic_sock.c +++ b/src/quic_sock.c @@ -536,14 +536,14 @@ int qc_snd_buf(struct quic_conn *qc, const struct buffer *buf, size_t sz, } while (ret < 0 && errno == EINTR); if (ret < 0 || ret != sz) { + struct proxy *prx = qc->li->bind_conf->frontend; + struct quic_counters *prx_counters = + EXTRA_COUNTERS_GET(prx->extra_counters_fe, + &quic_stats_module); + /* TODO adjust errno for UDP context. */ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOTCONN || errno == EINPROGRESS || errno == EBADF) { - struct proxy *prx = qc->li->bind_conf->frontend; - struct quic_counters *prx_counters = - EXTRA_COUNTERS_GET(prx->extra_counters_fe, - &quic_stats_module); - if (errno == EAGAIN || errno == EWOULDBLOCK) HA_ATOMIC_INC(&prx_counters->socket_full); else @@ -551,7 +551,7 @@ int qc_snd_buf(struct quic_conn *qc, const struct buffer *buf, size_t sz, } else if (errno) { /* TODO unlisted errno : handle it explicitly. */ - ABORT_NOW(); + HA_ATOMIC_INC(&prx_counters->sendto_err_unknown); } return 1;