From: Amaury Denoyelle Date: Mon, 24 Oct 2022 08:03:33 +0000 (+0200) Subject: MINOR: quic: do not crash on unhandled sendto error X-Git-Tag: v2.7-dev9~140 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1d9f170eddd8703ba550e91322298e88e8280075;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/haproxy/quic_stats-t.h b/include/haproxy/quic_stats-t.h index 8a682285c7..707825e4ad 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 8617489203..29f30ccbe0 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;