From 3bad4c939bb74323408e8a816ab129f813350c56 Mon Sep 17 00:00:00 2001 From: Viktor Liu Date: Thu, 4 Jun 2026 14:29:19 +0200 Subject: [PATCH] Run relay datagram fallback once per connection and annotate the datagram-sized marker --- shared/relay/client/client.go | 18 ++++++++---------- shared/relay/client/dialer/quic/quic.go | 4 +++- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/shared/relay/client/client.go b/shared/relay/client/client.go index a8d627538..002b8d134 100644 --- a/shared/relay/client/client.go +++ b/shared/relay/client/client.go @@ -672,26 +672,24 @@ func (c *Client) writeTo(containerRef *connContainer, dstID messages.PeerID, pay // transports. A single fallback is triggered per connection regardless of how // many oversized datagrams arrive. cause carries the datagram size and budget. func (c *Client) onDatagramTooLarge(conn net.Conn, cause error) { + // Handle one oversized datagram per connection; a burst triggers a single + // fallback (and a single log line), not many. + if !c.datagramFallbackTriggered.CompareAndSwap(false, true) { + return + } + // If the selected mode offers no non-datagram transport (e.g. pinned to a // datagram-sized transport), reconnecting would just re-fail, so leave the // connection up rather than loop. if len(nonDatagramSized(c.baseDialers(transportModeFromEnv()))) == 0 { - if c.datagramFallbackTriggered.CompareAndSwap(false, true) { - c.log.Warnf("%s, but no non-datagram transport is available, not falling back", cause) - } + c.log.Warnf("%s, but no non-datagram transport is available, not falling back", cause) return } // Without the shared tracker a reconnect would just select the same // transport again and re-fail, so leave the connection up rather than loop. if c.transportFallback == nil { - if c.datagramFallbackTriggered.CompareAndSwap(false, true) { - c.log.Debugf("%s, but no transport fallback configured, leaving connection up", cause) - } - return - } - - if !c.datagramFallbackTriggered.CompareAndSwap(false, true) { + c.log.Debugf("%s, but no transport fallback configured, leaving connection up", cause) return } diff --git a/shared/relay/client/dialer/quic/quic.go b/shared/relay/client/dialer/quic/quic.go index 80f771173..5e1758a1c 100644 --- a/shared/relay/client/dialer/quic/quic.go +++ b/shared/relay/client/dialer/quic/quic.go @@ -26,7 +26,9 @@ func (d Dialer) Protocol() string { // DatagramSized marks QUIC as a datagram-sized transport: relay traffic is // carried in QUIC DATAGRAM frames, which must fit a single packet. -func (d Dialer) DatagramSized() {} +func (d Dialer) DatagramSized() { + // Intentional marker method; presence is the capability signal. +} func (d Dialer) Dial(ctx context.Context, address, serverName string) (net.Conn, error) { quicURL, err := prepareURL(address)