diff --git a/substrate/client/network/src/discovery.rs b/substrate/client/network/src/discovery.rs index c758cb7000..8b3e04419f 100644 --- a/substrate/client/network/src/discovery.rs +++ b/substrate/client/network/src/discovery.rs @@ -55,6 +55,7 @@ use ip_network::IpNetwork; use libp2p::{ core::{Endpoint, Multiaddr}, kad::{ + self, record::store::{MemoryStore, RecordStore}, GetClosestPeersError, GetRecordOk, Kademlia, KademliaBucketInserts, KademliaConfig, KademliaEvent, QueryId, QueryResult, Quorum, Record, RecordKey, @@ -222,6 +223,9 @@ impl DiscoveryConfig { let store = MemoryStore::new(local_peer_id); let mut kad = Kademlia::with_config(local_peer_id, store, config); + // Always set the mode to server, so that any node can accept incoming Kademlia + // requests. Otherwise, the connectivity degrades significantly. + kad.set_mode(Some(kad::Mode::Server)); for (peer_id, addr) in &permanent_addresses { kad.add_address(peer_id, addr.clone()); @@ -983,7 +987,7 @@ mod tests { upgrade, }, identity::Keypair, - kad, noise, + noise, swarm::{Executor, Swarm, SwarmBuilder, SwarmEvent}, yamux, Multiaddr, }; @@ -1038,17 +1042,6 @@ mod tests { ) .build(); - // Set the Kademlia mode to server so that it can accept incoming requests. - // - // Note: the server mode is set automatically when the node learns its external - // address, but that does not happen in tests => hence we set it manually. - swarm - .behaviour_mut() - .kademlia - .as_mut() - .unwrap() - .set_mode(Some(kad::Mode::Server)); - let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap();