From 41991028b1074b08e9e2420b533ad8dae3bdf768 Mon Sep 17 00:00:00 2001 From: dharjeezy Date: Thu, 9 Oct 2025 13:48:26 +0100 Subject: [PATCH 1/6] improve efficiency of propagating address failures --- src/lib.rs | 7 ++++++ src/transport/manager/mod.rs | 47 ++++++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fc36c776d..f62930eab 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -198,6 +198,7 @@ impl Litep2p { config.fallback_names.clone(), config.codec, litep2p_config.keep_alive_timeout, + false ); let executor = Arc::clone(&litep2p_config.executor); litep2p_config.executor.run(Box::pin(async move { @@ -218,6 +219,7 @@ impl Litep2p { config.fallback_names.clone(), config.codec, litep2p_config.keep_alive_timeout, + false ); litep2p_config.executor.run(Box::pin(async move { RequestResponseProtocol::new(service, config).run().await @@ -233,6 +235,7 @@ impl Litep2p { Vec::new(), protocol.codec(), litep2p_config.keep_alive_timeout, + false ); litep2p_config.executor.run(Box::pin(async move { let _ = protocol.run(service).await; @@ -252,6 +255,7 @@ impl Litep2p { Vec::new(), ping_config.codec, litep2p_config.keep_alive_timeout, + false ); litep2p_config.executor.run(Box::pin(async move { Ping::new(service, ping_config).run().await @@ -275,6 +279,7 @@ impl Litep2p { fallback_names, kademlia_config.codec, litep2p_config.keep_alive_timeout, + true ); litep2p_config.executor.run(Box::pin(async move { let _ = Kademlia::new(service, kademlia_config).run().await; @@ -296,6 +301,7 @@ impl Litep2p { Vec::new(), identify_config.codec, litep2p_config.keep_alive_timeout, + false ); identify_config.public = Some(litep2p_config.keypair.public().into()); @@ -316,6 +322,7 @@ impl Litep2p { Vec::new(), bitswap_config.codec, litep2p_config.keep_alive_timeout, + false ); litep2p_config.executor.run(Box::pin(async move { Bitswap::new(service, bitswap_config).run().await diff --git a/src/transport/manager/mod.rs b/src/transport/manager/mod.rs index 013d4a7b5..e1d8040be 100644 --- a/src/transport/manager/mod.rs +++ b/src/transport/manager/mod.rs @@ -214,6 +214,9 @@ pub struct TransportManager { /// All names (main and fallback(s)) of the installed protocols. protocol_names: HashSet, + /// Protocols that need to be informed about dial failures with addresses. + address_reporting_protocols: HashSet, + /// Listen addresses. listen_addresses: Arc>>, @@ -294,6 +297,7 @@ impl TransportManager { protocols: HashMap::new(), transports: TransportContext::new(), protocol_names: HashSet::new(), + address_reporting_protocols: HashSet::new(), transport_manager_handle: handle.clone(), pending_connections: HashMap::new(), next_substream_id: Arc::new(AtomicUsize::new(0usize)), @@ -332,6 +336,7 @@ impl TransportManager { fallback_names: Vec, codec: ProtocolCodec, keep_alive_timeout: Duration, + needs_dial_failure_addresses: bool, ) -> TransportService { assert!(!self.protocol_names.contains(&protocol)); @@ -341,6 +346,12 @@ impl TransportManager { } } + if needs_dial_failure_addresses { + self.address_reporting_protocols.insert(protocol.clone()); + self.address_reporting_protocols + .extend(fallback_names.clone()); + } + let (service, sender) = TransportService::new( self.local_peer_id, protocol.clone(), @@ -1116,10 +1127,8 @@ impl TransportManager { ?protocol, "dial failure, notify protocol", ); - match context.tx.try_send(InnerTransportEvent::DialFailure { - peer, - addresses: vec![address.clone()], - }) { + + match context.tx.try_send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, vec![address.clone()])) { Ok(()) => {} Err(_) => { tracing::trace!( @@ -1132,10 +1141,7 @@ impl TransportManager { ); let _ = context .tx - .send(InnerTransportEvent::DialFailure { - peer, - addresses: vec![address.clone()], - }) + .send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, vec![address.clone()])) .await; } } @@ -1268,10 +1274,7 @@ impl TransportManager { for (protocol, context) in &self.protocols { let _ = match context .tx - .try_send(InnerTransportEvent::DialFailure { - peer, - addresses: addresses.clone(), - }) { + .try_send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, addresses.clone())) { Ok(_) => Ok(()), Err(_) => { tracing::trace!( @@ -1284,10 +1287,7 @@ impl TransportManager { context .tx - .send(InnerTransportEvent::DialFailure { - peer, - addresses: addresses.clone(), - }) + .send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, addresses.clone())) .await } }; @@ -1343,6 +1343,21 @@ impl TransportManager { } } +fn make_dial_failure_event( + address_reporting_protocols: &HashSet, + protocol: &ProtocolName, + peer: PeerId, + addresses: Vec, +) -> InnerTransportEvent { + let addresses = if address_reporting_protocols.contains(protocol) { + addresses + } else { + Vec::new() + }; + + InnerTransportEvent::DialFailure { peer, addresses } +} + #[cfg(test)] mod tests { use crate::transport::manager::{address::AddressStore, peer_state::SecondaryOrDialing}; From a7eaf7854acfd9b54d3b9b00dfa2409178f00b67 Mon Sep 17 00:00:00 2001 From: dharjeezy Date: Tue, 14 Oct 2025 10:30:25 +0100 Subject: [PATCH 2/6] DialFailureAddresses enum --- src/lib.rs | 15 +++++----- src/transport/manager/mod.rs | 55 ++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f62930eab..57719aa36 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,6 +58,7 @@ use multiaddr::{Multiaddr, Protocol}; use transport::Endpoint; use types::ConnectionId; +use crate::transport::manager::DialFailureAddresses; pub use bandwidth::BandwidthSink; pub use error::Error; pub use peer_id::PeerId; @@ -198,7 +199,7 @@ impl Litep2p { config.fallback_names.clone(), config.codec, litep2p_config.keep_alive_timeout, - false + DialFailureAddresses::NotRequired, ); let executor = Arc::clone(&litep2p_config.executor); litep2p_config.executor.run(Box::pin(async move { @@ -219,7 +220,7 @@ impl Litep2p { config.fallback_names.clone(), config.codec, litep2p_config.keep_alive_timeout, - false + DialFailureAddresses::NotRequired, ); litep2p_config.executor.run(Box::pin(async move { RequestResponseProtocol::new(service, config).run().await @@ -235,7 +236,7 @@ impl Litep2p { Vec::new(), protocol.codec(), litep2p_config.keep_alive_timeout, - false + DialFailureAddresses::NotRequired, ); litep2p_config.executor.run(Box::pin(async move { let _ = protocol.run(service).await; @@ -255,7 +256,7 @@ impl Litep2p { Vec::new(), ping_config.codec, litep2p_config.keep_alive_timeout, - false + DialFailureAddresses::NotRequired, ); litep2p_config.executor.run(Box::pin(async move { Ping::new(service, ping_config).run().await @@ -279,7 +280,7 @@ impl Litep2p { fallback_names, kademlia_config.codec, litep2p_config.keep_alive_timeout, - true + DialFailureAddresses::Required, ); litep2p_config.executor.run(Box::pin(async move { let _ = Kademlia::new(service, kademlia_config).run().await; @@ -301,7 +302,7 @@ impl Litep2p { Vec::new(), identify_config.codec, litep2p_config.keep_alive_timeout, - false + DialFailureAddresses::NotRequired, ); identify_config.public = Some(litep2p_config.keypair.public().into()); @@ -322,7 +323,7 @@ impl Litep2p { Vec::new(), bitswap_config.codec, litep2p_config.keep_alive_timeout, - false + DialFailureAddresses::NotRequired, ); litep2p_config.executor.run(Box::pin(async move { Bitswap::new(service, bitswap_config).run().await diff --git a/src/transport/manager/mod.rs b/src/transport/manager/mod.rs index e1d8040be..3601e693b 100644 --- a/src/transport/manager/mod.rs +++ b/src/transport/manager/mod.rs @@ -73,6 +73,12 @@ pub(crate) mod handle; /// Logging target for the file. const LOG_TARGET: &str = "litep2p::transport-manager"; +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum DialFailureAddresses { + Required, + NotRequired, +} + /// The connection established result. #[derive(Debug, Clone, Copy, Eq, PartialEq)] enum ConnectionEstablishedResult { @@ -106,6 +112,8 @@ pub struct ProtocolContext { /// Fallback names for the protocol. pub fallback_names: Vec, + + pub dial_failure_mode: DialFailureAddresses, } impl ProtocolContext { @@ -114,11 +122,20 @@ impl ProtocolContext { codec: ProtocolCodec, tx: Sender, fallback_names: Vec, + dial_failure_mode: DialFailureAddresses, ) -> Self { Self { tx, codec, fallback_names, + dial_failure_mode, + } + } + + fn dial_failure_addresses(&self, addresses: &[Multiaddr]) -> Vec { + match self.dial_failure_mode { + DialFailureAddresses::Required => addresses.to_vec(), + DialFailureAddresses::NotRequired => Vec::new(), } } } @@ -214,9 +231,6 @@ pub struct TransportManager { /// All names (main and fallback(s)) of the installed protocols. protocol_names: HashSet, - /// Protocols that need to be informed about dial failures with addresses. - address_reporting_protocols: HashSet, - /// Listen addresses. listen_addresses: Arc>>, @@ -297,7 +311,6 @@ impl TransportManager { protocols: HashMap::new(), transports: TransportContext::new(), protocol_names: HashSet::new(), - address_reporting_protocols: HashSet::new(), transport_manager_handle: handle.clone(), pending_connections: HashMap::new(), next_substream_id: Arc::new(AtomicUsize::new(0usize)), @@ -336,7 +349,7 @@ impl TransportManager { fallback_names: Vec, codec: ProtocolCodec, keep_alive_timeout: Duration, - needs_dial_failure_addresses: bool, + dial_failure_mode: DialFailureAddresses, ) -> TransportService { assert!(!self.protocol_names.contains(&protocol)); @@ -346,12 +359,6 @@ impl TransportManager { } } - if needs_dial_failure_addresses { - self.address_reporting_protocols.insert(protocol.clone()); - self.address_reporting_protocols - .extend(fallback_names.clone()); - } - let (service, sender) = TransportService::new( self.local_peer_id, protocol.clone(), @@ -363,7 +370,7 @@ impl TransportManager { self.protocols.insert( protocol.clone(), - ProtocolContext::new(codec, sender, fallback_names.clone()), + ProtocolContext::new(codec, sender, fallback_names.clone(), dial_failure_mode), ); self.protocol_names.insert(protocol); self.protocol_names.extend(fallback_names); @@ -1128,7 +1135,9 @@ impl TransportManager { "dial failure, notify protocol", ); - match context.tx.try_send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, vec![address.clone()])) { + let adresses = context.dial_failure_addresses(&[address.clone()]); + + match context.tx.try_send(make_dial_failure_event(peer, adresses.clone())) { Ok(()) => {} Err(_) => { tracing::trace!( @@ -1141,7 +1150,7 @@ impl TransportManager { ); let _ = context .tx - .send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, vec![address.clone()])) + .send(make_dial_failure_event(peer, adresses.clone())) .await; } } @@ -1272,9 +1281,10 @@ impl TransportManager { .collect::>(); for (protocol, context) in &self.protocols { + let addresses = context.dial_failure_addresses(&addresses); let _ = match context .tx - .try_send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, addresses.clone())) { + .try_send(make_dial_failure_event(peer, addresses.clone())) { Ok(_) => Ok(()), Err(_) => { tracing::trace!( @@ -1287,7 +1297,7 @@ impl TransportManager { context .tx - .send(make_dial_failure_event(&self.address_reporting_protocols, protocol, peer, addresses.clone())) + .send(make_dial_failure_event(peer, addresses.clone())) .await } }; @@ -1343,18 +1353,7 @@ impl TransportManager { } } -fn make_dial_failure_event( - address_reporting_protocols: &HashSet, - protocol: &ProtocolName, - peer: PeerId, - addresses: Vec, -) -> InnerTransportEvent { - let addresses = if address_reporting_protocols.contains(protocol) { - addresses - } else { - Vec::new() - }; - +fn make_dial_failure_event(peer: PeerId, addresses: Vec) -> InnerTransportEvent { InnerTransportEvent::DialFailure { peer, addresses } } From 3d19a9c3798043b547377c687978b4abe60505dd Mon Sep 17 00:00:00 2001 From: dharjeezy Date: Thu, 16 Oct 2025 11:44:18 +0100 Subject: [PATCH 3/6] nit --- src/transport/manager/mod.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/transport/manager/mod.rs b/src/transport/manager/mod.rs index 3601e693b..05b6873e7 100644 --- a/src/transport/manager/mod.rs +++ b/src/transport/manager/mod.rs @@ -73,9 +73,16 @@ pub(crate) mod handle; /// Logging target for the file. const LOG_TARGET: &str = "litep2p::transport-manager"; +/// Determines if a protocol requires the list of failed addresses upon a dial failure. +/// +/// This is used during protocol registration with the `TransportManager` to specify +/// whether `InnerTransportEvent::DialFailure` events sent to this protocol should +/// include the specific multiaddresses that failed. #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum DialFailureAddresses { + /// The protocol needs the list of failed addresses. Required, + /// The protocol does not need the list of failed addresses. NotRequired, } @@ -113,6 +120,7 @@ pub struct ProtocolContext { /// Fallback names for the protocol. pub fallback_names: Vec, + /// Specifies if the protocol requires dial failure addresses. pub dial_failure_mode: DialFailureAddresses, } @@ -1135,9 +1143,9 @@ impl TransportManager { "dial failure, notify protocol", ); - let adresses = context.dial_failure_addresses(&[address.clone()]); + let addresses = context.dial_failure_addresses(&[address.clone()]); - match context.tx.try_send(make_dial_failure_event(peer, adresses.clone())) { + match context.tx.try_send(InnerTransportEvent::DialFailure { peer, addresses: addresses.clone() }) { Ok(()) => {} Err(_) => { tracing::trace!( @@ -1150,7 +1158,7 @@ impl TransportManager { ); let _ = context .tx - .send(make_dial_failure_event(peer, adresses.clone())) + .send(InnerTransportEvent::DialFailure { peer, addresses }) .await; } } @@ -1284,7 +1292,7 @@ impl TransportManager { let addresses = context.dial_failure_addresses(&addresses); let _ = match context .tx - .try_send(make_dial_failure_event(peer, addresses.clone())) { + .try_send(InnerTransportEvent::DialFailure { peer, addresses: addresses.clone() }) { Ok(_) => Ok(()), Err(_) => { tracing::trace!( @@ -1297,7 +1305,7 @@ impl TransportManager { context .tx - .send(make_dial_failure_event(peer, addresses.clone())) + .send(InnerTransportEvent::DialFailure { peer, addresses }) .await } }; @@ -1353,10 +1361,6 @@ impl TransportManager { } } -fn make_dial_failure_event(peer: PeerId, addresses: Vec) -> InnerTransportEvent { - InnerTransportEvent::DialFailure { peer, addresses } -} - #[cfg(test)] mod tests { use crate::transport::manager::{address::AddressStore, peer_state::SecondaryOrDialing}; From 6777dcacd3d3ccdf36c792e263524d24114f7301 Mon Sep 17 00:00:00 2001 From: dharjeezy Date: Thu, 20 Nov 2025 15:41:08 +0100 Subject: [PATCH 4/6] doc --- src/protocol/protocol_set.rs | 3 ++- src/transport/mod.rs | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/protocol/protocol_set.rs b/src/protocol/protocol_set.rs index 3993e89a7..0a1cd361e 100644 --- a/src/protocol/protocol_set.rs +++ b/src/protocol/protocol_set.rs @@ -83,7 +83,8 @@ pub enum InnerTransportEvent { /// Failed to dial peer. /// - /// This is reported to that protocol which initiated the connection. + /// This is reported to that protocol which initiated the connection. The addresses are only forwarded + /// if the protocol was registered with `DialFailureAddresses::Required`. DialFailure { /// Peer ID. peer: PeerId, diff --git a/src/transport/mod.rs b/src/transport/mod.rs index 79c582c03..3e764bef3 100644 --- a/src/transport/mod.rs +++ b/src/transport/mod.rs @@ -154,6 +154,7 @@ pub(crate) enum TransportEvent { }, /// Failed to dial remote peer. + /// The addresses are only forwarded to the protocol if it was registered with `DialFailureAddresses::Required`. DialFailure { /// Connection ID. connection_id: ConnectionId, @@ -166,6 +167,7 @@ pub(crate) enum TransportEvent { }, /// Open failure for an unnegotiated set of connections. + /// The addresses are only forwarded to the protocol if it was registered with `DialFailureAddresses::Required`. OpenFailure { /// Connection ID. connection_id: ConnectionId, From 7dc2be5bccf1ed1d57afba13caae63a61569e11d Mon Sep 17 00:00:00 2001 From: dharjeezy Date: Tue, 25 Nov 2025 11:49:49 +0100 Subject: [PATCH 5/6] Update src/transport/mod.rs Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> --- src/transport/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transport/mod.rs b/src/transport/mod.rs index 3e764bef3..2e4249ca5 100644 --- a/src/transport/mod.rs +++ b/src/transport/mod.rs @@ -154,7 +154,7 @@ pub(crate) enum TransportEvent { }, /// Failed to dial remote peer. - /// The addresses are only forwarded to the protocol if it was registered with `DialFailureAddresses::Required`. + /// The addresses are only forwarded to the protocol if it was registered with `DialFailureAddresses::Required`. DialFailure { /// Connection ID. connection_id: ConnectionId, From 48d971c177368a61af969274ae65ae971a66deae Mon Sep 17 00:00:00 2001 From: dharjeezy Date: Tue, 25 Nov 2025 12:00:09 +0100 Subject: [PATCH 6/6] CI fixes --- src/protocol/protocol_set.rs | 4 ++++ src/transport/manager/mod.rs | 8 +++++++- src/transport/quic/mod.rs | 3 +++ src/transport/tcp/mod.rs | 8 ++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/protocol/protocol_set.rs b/src/protocol/protocol_set.rs index 0a1cd361e..ff84e982e 100644 --- a/src/protocol/protocol_set.rs +++ b/src/protocol/protocol_set.rs @@ -438,6 +438,7 @@ mod tests { use super::*; use crate::mock::substream::MockSubstream; use std::collections::HashSet; + use crate::transport::manager::DialFailureAddresses; #[tokio::test] async fn fallback_is_provided() { @@ -457,6 +458,7 @@ mod tests { ProtocolName::from("/notif/1/fallback/1"), ProtocolName::from("/notif/1/fallback/2"), ], + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), ); @@ -504,6 +506,7 @@ mod tests { ProtocolName::from("/notif/1/fallback/1"), ProtocolName::from("/notif/1/fallback/2"), ], + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), ); @@ -551,6 +554,7 @@ mod tests { ProtocolName::from("/notif/1/fallback/1"), ProtocolName::from("/notif/1/fallback/2"), ], + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), ); diff --git a/src/transport/manager/mod.rs b/src/transport/manager/mod.rs index bd4e77ae0..b82fa097d 100644 --- a/src/transport/manager/mod.rs +++ b/src/transport/manager/mod.rs @@ -1213,7 +1213,7 @@ impl TransportManager { "dial failure, notify protocol", ); - let addresses = context.dial_failure_addresses(&[address.clone()]); + let addresses = context.dial_failure_addresses(std::slice::from_ref(&address)); match context.tx.try_send(InnerTransportEvent::DialFailure { peer, addresses: addresses.clone() }) { Ok(()) => {} @@ -1666,12 +1666,14 @@ mod tests { Vec::new(), ProtocolCodec::UnsignedVarint(None), KEEP_ALIVE_TIMEOUT, + DialFailureAddresses::NotRequired ); manager.register_protocol( ProtocolName::from("/notif/1"), Vec::new(), ProtocolCodec::UnsignedVarint(None), KEEP_ALIVE_TIMEOUT, + DialFailureAddresses::NotRequired ); } @@ -1686,6 +1688,7 @@ mod tests { Vec::new(), ProtocolCodec::UnsignedVarint(None), KEEP_ALIVE_TIMEOUT, + DialFailureAddresses::NotRequired, ); manager.register_protocol( ProtocolName::from("/notif/2"), @@ -1695,6 +1698,7 @@ mod tests { ], ProtocolCodec::UnsignedVarint(None), KEEP_ALIVE_TIMEOUT, + DialFailureAddresses::NotRequired, ); } @@ -1712,6 +1716,7 @@ mod tests { ], ProtocolCodec::UnsignedVarint(None), KEEP_ALIVE_TIMEOUT, + DialFailureAddresses::NotRequired, ); manager.register_protocol( ProtocolName::from("/notif/2"), @@ -1721,6 +1726,7 @@ mod tests { ], ProtocolCodec::UnsignedVarint(None), KEEP_ALIVE_TIMEOUT, + DialFailureAddresses::NotRequired, ); } diff --git a/src/transport/quic/mod.rs b/src/transport/quic/mod.rs index 2c1536317..d2ea05bc6 100644 --- a/src/transport/quic/mod.rs +++ b/src/transport/quic/mod.rs @@ -595,6 +595,7 @@ mod tests { }; use multihash::Multihash; use tokio::sync::mpsc::channel; + use crate::transport::manager::DialFailureAddresses; #[tokio::test] async fn test_quinn() { @@ -620,6 +621,7 @@ mod tests { tx: tx1, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), }; @@ -647,6 +649,7 @@ mod tests { tx: tx2, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), }; diff --git a/src/transport/tcp/mod.rs b/src/transport/tcp/mod.rs index 9d7524335..1052bfe72 100644 --- a/src/transport/tcp/mod.rs +++ b/src/transport/tcp/mod.rs @@ -710,6 +710,7 @@ mod tests { use multihash::Multihash; use std::sync::Arc; use tokio::sync::mpsc::channel; + use crate::transport::manager::DialFailureAddresses; #[tokio::test] async fn connect_and_accept_works() { @@ -736,6 +737,7 @@ mod tests { tx: tx1, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), }; @@ -767,7 +769,9 @@ mod tests { tx: tx2, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, + )]), }; let transport_config2 = Config { @@ -830,6 +834,7 @@ mod tests { tx: tx1, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), }; @@ -861,6 +866,7 @@ mod tests { tx: tx2, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), }; @@ -919,6 +925,7 @@ mod tests { tx: tx1, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), }; @@ -957,6 +964,7 @@ mod tests { tx: tx2, codec: ProtocolCodec::Identity(32), fallback_names: Vec::new(), + dial_failure_mode: DialFailureAddresses::NotRequired, }, )]), };