From 93c46ce3e17c3592f66fee59e9148c70125037a4 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 26 Feb 2020 20:41:26 +0100 Subject: [PATCH 1/2] Hotfix the large number of connections --- client/network/src/behaviour.rs | 4 ++-- client/network/src/discovery.rs | 22 ++++++++++++++++------ client/network/src/service.rs | 1 + 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index a03a6caa2f5ee..fb73f90560bd9 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -66,7 +66,7 @@ impl Behaviour { known_addresses: Vec<(PeerId, Multiaddr)>, enable_mdns: bool, allow_private_ipv4: bool, - discovery_only_if_under_num: u64, + allow_out_only_if_under_num: u64, block_requests: protocol::BlockRequests, light_client_handler: protocol::LightClientHandler, ) -> Self { @@ -78,7 +78,7 @@ impl Behaviour { known_addresses, enable_mdns, allow_private_ipv4, - discovery_only_if_under_num, + allow_out_only_if_under_num, ).await, block_requests, light_client_handler, diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 8360fce518607..381c6db0a6aa7 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -85,8 +85,11 @@ pub struct DiscoveryBehaviour { /// If false, `addresses_of_peer` won't return any private IPv4 address, except for the ones /// stored in `user_defined`. allow_private_ipv4: bool, - /// Number of active connections over which we interrupt the discovery process. - discovery_only_if_under_num: u64, + /// Number of active connections over which we interrupt the discovery process and pretend to + /// have forgotten about all addresses other than the ones of reserved nodes and bootnodes. If + /// this module is the only address book provided to the libp2p swarm (which is the case at + /// the time of writing), this effectively blocks any new outgoing connection. + allow_out_only_if_under_num: u64, } impl DiscoveryBehaviour { @@ -98,7 +101,7 @@ impl DiscoveryBehaviour { user_defined: Vec<(PeerId, Multiaddr)>, enable_mdns: bool, allow_private_ipv4: bool, - discovery_only_if_under_num: u64, + allow_out_only_if_under_num: u64, ) -> Self { if enable_mdns { #[cfg(target_os = "unknown")] @@ -121,7 +124,7 @@ impl DiscoveryBehaviour { local_peer_id: local_public_key.into_peer_id(), num_connections: 0, allow_private_ipv4, - discovery_only_if_under_num, + allow_out_only_if_under_num, #[cfg(not(target_os = "unknown"))] mdns: if enable_mdns { match Mdns::new() { @@ -218,6 +221,13 @@ impl NetworkBehaviour for DiscoveryBehaviour { .filter_map(|(p, a)| if p == peer_id { Some(a.clone()) } else { None }) .collect::>(); + // We temporarily enforce a hard-limit on the number of outgoing connections by + // pretending we don't know how to reach any other node if the number of connections is + // too high. + if self.num_connections >= self.allow_out_only_if_under_num { + return list; + } + { let mut list_to_filter = self.kademlia.addresses_of_peer(peer_id); #[cfg(not(target_os = "unknown"))] @@ -330,7 +340,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { // Poll the stream that fires when we need to start a random Kademlia query. while let Poll::Ready(_) = self.next_kad_random_query.poll_unpin(cx) { - if self.num_connections < self.discovery_only_if_under_num { + if self.num_connections < self.allow_out_only_if_under_num { let random_peer_id = PeerId::random(); debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ {:?}", random_peer_id); @@ -451,7 +461,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { NetworkBehaviourAction::GenerateEvent(event) => { match event { MdnsEvent::Discovered(list) => { - if self.num_connections >= self.discovery_only_if_under_num { + if self.num_connections >= self.allow_out_only_if_under_num { continue; } diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 288289d95c81e..ef574758b1e92 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -256,6 +256,7 @@ impl NetworkWorker { if let Some(spawner) = params.executor { builder = builder.executor_fn(spawner); } + builder = builder.incoming_limit(Some(params.network_config.in_peers)); (builder.build(), bandwidth) }; From d05b1eb69f84f20cb3343cc24ff9c12cf8e9badb Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 26 Feb 2020 21:29:47 +0100 Subject: [PATCH 2/2] Revert the incoming_limit --- client/network/src/service.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/client/network/src/service.rs b/client/network/src/service.rs index ef574758b1e92..288289d95c81e 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -256,7 +256,6 @@ impl NetworkWorker { if let Some(spawner) = params.executor { builder = builder.executor_fn(spawner); } - builder = builder.incoming_limit(Some(params.network_config.in_peers)); (builder.build(), bandwidth) };