Skip to content
Snippets Groups Projects
Commit b0a74954 authored by Pierre Krieger's avatar Pierre Krieger Committed by GitHub
Browse files

Pause Kademlia if too many connections (#4828)


* Pause Kademlia if too many connections

* Fix test

* Update client/network/src/discovery.rs

Co-Authored-By: default avatarToralf Wittner <tw@dtex.org>

* Change the limit

Co-authored-by: default avatarToralf Wittner <tw@dtex.org>
parent ea69238d
No related merge requests found
...@@ -65,6 +65,7 @@ impl<B: BlockT, S: NetworkSpecialization<B>, H: ExHashT> Behaviour<B, S, H> { ...@@ -65,6 +65,7 @@ impl<B: BlockT, S: NetworkSpecialization<B>, H: ExHashT> Behaviour<B, S, H> {
known_addresses: Vec<(PeerId, Multiaddr)>, known_addresses: Vec<(PeerId, Multiaddr)>,
enable_mdns: bool, enable_mdns: bool,
allow_private_ipv4: bool, allow_private_ipv4: bool,
discovery_only_if_under_num: u64,
) -> Self { ) -> Self {
Behaviour { Behaviour {
substrate, substrate,
...@@ -73,7 +74,8 @@ impl<B: BlockT, S: NetworkSpecialization<B>, H: ExHashT> Behaviour<B, S, H> { ...@@ -73,7 +74,8 @@ impl<B: BlockT, S: NetworkSpecialization<B>, H: ExHashT> Behaviour<B, S, H> {
local_public_key, local_public_key,
known_addresses, known_addresses,
enable_mdns, enable_mdns,
allow_private_ipv4 allow_private_ipv4,
discovery_only_if_under_num,
).await, ).await,
events: Vec::new(), events: Vec::new(),
} }
......
...@@ -87,6 +87,8 @@ pub struct DiscoveryBehaviour<TSubstream> { ...@@ -87,6 +87,8 @@ pub struct DiscoveryBehaviour<TSubstream> {
/// If false, `addresses_of_peer` won't return any private IPv4 address, except for the ones /// If false, `addresses_of_peer` won't return any private IPv4 address, except for the ones
/// stored in `user_defined`. /// stored in `user_defined`.
allow_private_ipv4: bool, allow_private_ipv4: bool,
/// Number of active connections over which we interrupt the discovery process.
discovery_only_if_under_num: u64,
} }
impl<TSubstream> DiscoveryBehaviour<TSubstream> { impl<TSubstream> DiscoveryBehaviour<TSubstream> {
...@@ -98,6 +100,7 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> { ...@@ -98,6 +100,7 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> {
user_defined: Vec<(PeerId, Multiaddr)>, user_defined: Vec<(PeerId, Multiaddr)>,
enable_mdns: bool, enable_mdns: bool,
allow_private_ipv4: bool, allow_private_ipv4: bool,
discovery_only_if_under_num: u64,
) -> Self { ) -> Self {
if enable_mdns { if enable_mdns {
#[cfg(target_os = "unknown")] #[cfg(target_os = "unknown")]
...@@ -120,6 +123,7 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> { ...@@ -120,6 +123,7 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> {
local_peer_id: local_public_key.into_peer_id(), local_peer_id: local_public_key.into_peer_id(),
num_connections: 0, num_connections: 0,
allow_private_ipv4, allow_private_ipv4,
discovery_only_if_under_num,
#[cfg(not(target_os = "unknown"))] #[cfg(not(target_os = "unknown"))]
mdns: if enable_mdns { mdns: if enable_mdns {
match Mdns::new() { match Mdns::new() {
...@@ -331,11 +335,19 @@ where ...@@ -331,11 +335,19 @@ where
// Poll the stream that fires when we need to start a random Kademlia query. // 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) { while let Poll::Ready(_) = self.next_kad_random_query.poll_unpin(cx) {
let random_peer_id = PeerId::random(); if self.num_connections < self.discovery_only_if_under_num {
debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ let random_peer_id = PeerId::random();
{:?}", random_peer_id); debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \
{:?}", random_peer_id);
self.kademlia.get_closest_peers(random_peer_id); self.kademlia.get_closest_peers(random_peer_id);
} else {
debug!(
target: "sub-libp2p",
"Kademlia paused due to high number of connections ({})",
self.num_connections
);
}
// Schedule the next random query with exponentially increasing delay, // Schedule the next random query with exponentially increasing delay,
// capped at 60 seconds. // capped at 60 seconds.
...@@ -435,6 +447,10 @@ where ...@@ -435,6 +447,10 @@ where
NetworkBehaviourAction::GenerateEvent(event) => { NetworkBehaviourAction::GenerateEvent(event) => {
match event { match event {
MdnsEvent::Discovered(list) => { MdnsEvent::Discovered(list) => {
if self.num_connections >= self.discovery_only_if_under_num {
continue;
}
self.discoveries.extend(list.into_iter().map(|(peer_id, _)| peer_id)); self.discoveries.extend(list.into_iter().map(|(peer_id, _)| peer_id));
if let Some(peer_id) = self.discoveries.pop_front() { if let Some(peer_id) = self.discoveries.pop_front() {
let ev = DiscoveryOut::Discovered(peer_id); let ev = DiscoveryOut::Discovered(peer_id);
...@@ -502,7 +518,7 @@ mod tests { ...@@ -502,7 +518,7 @@ mod tests {
let user_defined = user_defined.clone(); let user_defined = user_defined.clone();
let keypair_public = keypair.public(); let keypair_public = keypair.public();
async move { async move {
DiscoveryBehaviour::new(keypair_public, user_defined, false, true).await DiscoveryBehaviour::new(keypair_public, user_defined, false, true, 50).await
} }
}); });
let mut swarm = Swarm::new(transport, behaviour, keypair.public().into_peer_id()); let mut swarm = Swarm::new(transport, behaviour, keypair.public().into_peer_id());
......
...@@ -232,6 +232,7 @@ impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> NetworkWorker ...@@ -232,6 +232,7 @@ impl<B: BlockT + 'static, S: NetworkSpecialization<B>, H: ExHashT> NetworkWorker
TransportConfig::MemoryOnly => false, TransportConfig::MemoryOnly => false,
TransportConfig::Normal { allow_private_ipv4, .. } => allow_private_ipv4, TransportConfig::Normal { allow_private_ipv4, .. } => allow_private_ipv4,
}, },
u64::from(params.network_config.out_peers) + 15,
)); ));
let (transport, bandwidth) = { let (transport, bandwidth) = {
let (config_mem, config_wasm) = match params.network_config.transport { let (config_mem, config_wasm) = match params.network_config.transport {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment