Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

expose setting kademlia replication factor through node CLI #14391

Merged
merged 4 commits into from
Jun 21, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion client/cli/src/params/network_params.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use sc_service::{
config::{Multiaddr, MultiaddrWithPeerId},
ChainSpec, ChainType,
};
use std::{borrow::Cow, path::PathBuf};
use std::{borrow::Cow, num::NonZeroUsize, path::PathBuf};

/// Parameters used to create the network configuration.
#[derive(Debug, Clone, Args)]
Expand Down Expand Up @@ -121,6 +121,13 @@ pub struct NetworkParams {
#[arg(long)]
pub kademlia_disjoint_query_paths: bool,

/// Kademlia replication factor determines to how many closest peers a record is replicated to.
///
/// Discovery mechanism requires successful replication to all
/// `kademlia_replication_factor` peers to consider record successfully put.
#[arg(long, default_value = "20")]
pub kademlia_replication_factor: NonZeroUsize,

/// Join the IPFS network and serve transactions over bitswap protocol.
#[arg(long)]
pub ipfs_server: bool,
Expand Down Expand Up @@ -233,6 +240,7 @@ impl NetworkParams {
enable_dht_random_walk: !self.reserved_only,
allow_non_globals_in_dht,
kademlia_disjoint_query_paths: self.kademlia_disjoint_query_paths,
kademlia_replication_factor: Some(self.kademlia_replication_factor),
yamux_window_size: None,
ipfs_server: self.ipfs_server,
sync_mode: self.sync.into(),
Expand Down
5 changes: 5 additions & 0 deletions client/network/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ use std::{
io::{self, Write},
iter,
net::Ipv4Addr,
num::NonZeroUsize,
path::{Path, PathBuf},
pin::Pin,
str::{self, FromStr},
Expand Down Expand Up @@ -605,6 +606,9 @@ pub struct NetworkConfiguration {
/// the presence of potentially adversarial nodes.
pub kademlia_disjoint_query_paths: bool,

/// None will end up using default Kademlia value.
pub kademlia_replication_factor: Option<NonZeroUsize>,
klbrvik marked this conversation as resolved.
Show resolved Hide resolved

/// Enable serving block data over IPFS bitswap.
pub ipfs_server: bool,

Expand Down Expand Up @@ -656,6 +660,7 @@ impl NetworkConfiguration {
enable_dht_random_walk: true,
allow_non_globals_in_dht: false,
kademlia_disjoint_query_paths: false,
kademlia_replication_factor: None,
yamux_window_size: None,
ipfs_server: false,
}
Expand Down
14 changes: 14 additions & 0 deletions client/network/src/discovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ pub struct DiscoveryConfig {
enable_mdns: bool,
kademlia_disjoint_query_paths: bool,
kademlia_protocols: Vec<Vec<u8>>,
kademlia_replication_factor: Option<NonZeroUsize>,
}

impl DiscoveryConfig {
Expand All @@ -116,6 +117,7 @@ impl DiscoveryConfig {
enable_mdns: false,
kademlia_disjoint_query_paths: false,
kademlia_protocols: Vec::new(),
kademlia_replication_factor: None,
}
}

Expand Down Expand Up @@ -182,6 +184,12 @@ impl DiscoveryConfig {
self
}

/// Sets Kademlia replication factor.
pub fn with_kademlia_replication_factor(&mut self, value: NonZeroUsize) -> &mut Self {
self.kademlia_replication_factor = Some(value);
self
}

/// Create a `DiscoveryBehaviour` from this config.
pub fn finish(self) -> DiscoveryBehaviour {
let Self {
Expand All @@ -194,10 +202,16 @@ impl DiscoveryConfig {
enable_mdns,
kademlia_disjoint_query_paths,
kademlia_protocols,
kademlia_replication_factor,
} = self;

let kademlia = if !kademlia_protocols.is_empty() {
let mut config = KademliaConfig::default();

if let Some(replication_factor) = kademlia_replication_factor {
config.set_replication_factor(replication_factor);
}

config.set_protocol_names(kademlia_protocols.into_iter().map(Into::into).collect());
// By default Kademlia attempts to insert all peers into its routing table once a
// dialing attempt succeeds. In order to control which peer is added, disable the
Expand Down
6 changes: 6 additions & 0 deletions client/network/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,12 @@ where
network_config.kademlia_disjoint_query_paths,
);

if let Some(kademlia_replication_factor) =
network_config.kademlia_replication_factor
{
config.with_kademlia_replication_factor(kademlia_replication_factor);
}

match network_config.transport {
TransportConfig::MemoryOnly => {
config.with_mdns(false);
Expand Down