diff --git a/iroh/src/magicsock.rs b/iroh/src/magicsock.rs index 0bef9bd7b7b..3f849346bd9 100644 --- a/iroh/src/magicsock.rs +++ b/iroh/src/magicsock.rs @@ -539,12 +539,22 @@ impl MagicSock { .as_ref() .map(|err| err.kind() == io::ErrorKind::WouldBlock) .unwrap_or_default(); + let relay_pending = relay_error .as_ref() .map(|err| err.kind() == io::ErrorKind::WouldBlock) .unwrap_or_default(); - if udp_pending && relay_pending { + + let would_block = match (&udp_addr, &relay_url) { + (Some(_udp), Some(_relay)) => udp_pending && relay_pending, + (Some(_udp), None) => udp_pending, + (None, Some(_relay)) => relay_pending, + (None, None) => false, + }; + + if would_block { // Handle backpressure. + inc!(MagicsockMetrics, send_would_block); Err(io::Error::new(io::ErrorKind::WouldBlock, "pending")) } else { if relay_sent || udp_sent { diff --git a/iroh/src/magicsock/metrics.rs b/iroh/src/magicsock/metrics.rs index 90b5ae9d471..02a208c6de9 100644 --- a/iroh/src/magicsock/metrics.rs +++ b/iroh/src/magicsock/metrics.rs @@ -20,6 +20,7 @@ pub struct Metrics { // Data packets (non-disco) pub send_data: Counter, pub send_data_network_down: Counter, + pub send_would_block: Counter, pub recv_data_relay: Counter, pub recv_data_ipv4: Counter, pub recv_data_ipv6: Counter, @@ -99,6 +100,7 @@ impl Default for Metrics { // Data packets (non-disco) send_data: Counter::new("send_data"), send_data_network_down: Counter::new("send_data_network_down"), + send_would_block: Counter::new("send_data"), recv_data_relay: Counter::new("recv_data_relay"), recv_data_ipv4: Counter::new("recv_data_ipv4"), recv_data_ipv6: Counter::new("recv_data_ipv6"),