Skip to content

Commit bedec64

Browse files
authored
feat(gossipsub): expose mesh_n configs (#118)
1 parent fd7ab4c commit bedec64

File tree

3 files changed

+67
-5
lines changed

3 files changed

+67
-5
lines changed

crates/p2p/src/swarm/behavior.rs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,16 @@ pub struct Behaviour {
115115
///
116116
/// Returns a configured [`Gossipsub`] instance or an error string if configuration fails.
117117
#[cfg(feature = "gossipsub")]
118+
#[expect(clippy::too_many_arguments, reason = "We need these")]
118119
fn create_gossipsub(
119120
keypair: &Keypair,
120121
topic: &Sha256Topic,
121122
gossipsub_score_params: &Option<PeerScoreParams>,
122123
gossipsub_score_thresholds: &Option<PeerScoreThresholds>,
123124
max_transmit_size: usize,
125+
mesh_n: Option<usize>,
126+
mesh_n_low: Option<usize>,
127+
mesh_n_high: Option<usize>,
124128
) -> Result<Gossipsub<IdentityTransform, WhitelistSubscriptionFilter>, &'static str> {
125129
let mut filter = HashSet::new();
126130
filter.insert(topic.hash()); // Target topic for subscription.
@@ -138,13 +142,26 @@ fn create_gossipsub(
138142

139143
let peer_score_thresholds = gossipsub_score_thresholds.clone().unwrap_or_default();
140144

145+
let mut config_builder = gossipsub::ConfigBuilder::default();
146+
config_builder
147+
.validation_mode(ValidationMode::Permissive)
148+
.validate_messages()
149+
.max_transmit_size(max_transmit_size)
150+
.idontwant_on_publish(true);
151+
152+
if let Some(n) = mesh_n {
153+
config_builder.mesh_n(n);
154+
}
155+
if let Some(n_low) = mesh_n_low {
156+
config_builder.mesh_n_low(n_low);
157+
}
158+
if let Some(n_high) = mesh_n_high {
159+
config_builder.mesh_n_high(n_high);
160+
}
161+
141162
let gossipsub = Gossipsub::new_with_subscription_filter(
142163
MessageAuthenticity::Author(PeerId::from_public_key(&keypair.public().clone())),
143-
gossipsub::ConfigBuilder::default()
144-
.validation_mode(ValidationMode::Permissive)
145-
.validate_messages()
146-
.max_transmit_size(max_transmit_size)
147-
.idontwant_on_publish(true)
164+
config_builder
148165
.build()
149166
.expect("gossipsub config at this stage must be valid"),
150167
WhitelistSubscriptionFilter(filter),
@@ -237,6 +254,9 @@ impl Behaviour {
237254
#[cfg(feature = "gossipsub")] gossipsub_score_params: &Option<PeerScoreParams>,
238255
#[cfg(feature = "gossipsub")] gossipsub_score_thresholds: &Option<PeerScoreThresholds>,
239256
#[cfg(feature = "gossipsub")] gossipsub_max_transmit_size: usize,
257+
#[cfg(feature = "gossipsub")] gossipsub_mesh_n: Option<usize>,
258+
#[cfg(feature = "gossipsub")] gossipsub_mesh_n_low: Option<usize>,
259+
#[cfg(feature = "gossipsub")] gossipsub_mesh_n_high: Option<usize>,
240260
#[cfg(feature = "byos")] signer: Arc<dyn ApplicationSigner>,
241261
#[cfg(feature = "byos")] envelope_max_age: std::time::Duration,
242262
#[cfg(feature = "byos")] max_clock_skew: std::time::Duration,
@@ -253,6 +273,9 @@ impl Behaviour {
253273
gossipsub_score_params,
254274
gossipsub_score_thresholds,
255275
gossipsub_max_transmit_size,
276+
gossipsub_mesh_n,
277+
gossipsub_mesh_n_low,
278+
gossipsub_mesh_n_high,
256279
)?;
257280

258281
#[cfg(feature = "kad")]

crates/p2p/src/swarm/mod.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,27 @@ pub struct P2PConfig {
354354
#[cfg(feature = "gossipsub")]
355355
pub gossipsub_score_thresholds: Option<PeerScoreThresholds>,
356356

357+
/// Target number of peers in the gossipsub mesh.
358+
///
359+
/// If [`None`], defaults to libp2p's default of 6.
360+
/// This is the ideal number of peers the node will try to maintain in its mesh.
361+
#[cfg(feature = "gossipsub")]
362+
pub gossipsub_mesh_n: Option<usize>,
363+
364+
/// Minimum number of peers in the gossipsub mesh.
365+
///
366+
/// If [`None`], defaults to libp2p's default of 5.
367+
/// If the mesh falls below this number, the node will attempt to graft more peers.
368+
#[cfg(feature = "gossipsub")]
369+
pub gossipsub_mesh_n_low: Option<usize>,
370+
371+
/// Maximum number of peers in the gossipsub mesh.
372+
///
373+
/// If [`None`], defaults to libp2p's default of 12.
374+
/// If the mesh exceeds this number, the node will prune excess peers.
375+
#[cfg(feature = "gossipsub")]
376+
pub gossipsub_mesh_n_high: Option<usize>,
377+
357378
/// Buffer size for gossip event broadcast channels.
358379
///
359380
/// If [`None`], the default buffer size will be used.
@@ -3042,6 +3063,12 @@ macro_rules! finish_swarm {
30423063
#[cfg(feature = "gossipsub")]
30433064
$cfg.gossipsub_max_transmit_size
30443065
.unwrap_or(MAX_TRANSMIT_SIZE),
3066+
#[cfg(feature = "gossipsub")]
3067+
$cfg.gossipsub_mesh_n,
3068+
#[cfg(feature = "gossipsub")]
3069+
$cfg.gossipsub_mesh_n_low,
3070+
#[cfg(feature = "gossipsub")]
3071+
$cfg.gossipsub_mesh_n_high,
30453072
#[cfg(feature = "byos")]
30463073
$signer.clone(),
30473074
#[cfg(feature = "byos")]
@@ -3148,6 +3175,12 @@ pub fn with_default_transport(
31483175
config
31493176
.gossipsub_max_transmit_size
31503177
.unwrap_or(MAX_TRANSMIT_SIZE),
3178+
#[cfg(feature = "gossipsub")]
3179+
config.gossipsub_mesh_n,
3180+
#[cfg(feature = "gossipsub")]
3181+
config.gossipsub_mesh_n_low,
3182+
#[cfg(feature = "gossipsub")]
3183+
config.gossipsub_mesh_n_high,
31513184
#[cfg(feature = "byos")]
31523185
signer.clone(),
31533186
#[cfg(feature = "byos")]

crates/p2p/src/tests/common.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@ impl User {
203203
#[cfg(feature = "gossipsub")]
204204
gossipsub_score_thresholds: None,
205205
#[cfg(feature = "gossipsub")]
206+
gossipsub_mesh_n: None,
207+
#[cfg(feature = "gossipsub")]
208+
gossipsub_mesh_n_low: None,
209+
#[cfg(feature = "gossipsub")]
210+
gossipsub_mesh_n_high: None,
211+
#[cfg(feature = "gossipsub")]
206212
gossip_event_buffer_size: None,
207213
command_buffer_size: None,
208214
commands_event_buffer_size: None,

0 commit comments

Comments
 (0)