Skip to content

Commit

Permalink
Attempt to publish to at least mesh_n peers (#5357)
Browse files Browse the repository at this point in the history
* Code improvements

* Fix gossipsub tests

* Merge latest unstable

* Differentiate errors and better scoring

* Attempt to publish to mesh_n peers
  • Loading branch information
AgeManning authored Mar 7, 2024
1 parent b961457 commit fc8f1a4
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 7 deletions.
37 changes: 32 additions & 5 deletions beacon_node/lighthouse_network/src/gossipsub/behaviour.rs
Original file line number Diff line number Diff line change
Expand Up @@ -635,9 +635,33 @@ where
|| !self.score_below_threshold(p, |ts| ts.publish_threshold).0
}));
} else {
match self.mesh.get(&raw_message.topic) {
match self.mesh.get(&topic_hash) {
// Mesh peers
Some(mesh_peers) => {
// We have a mesh set. We want to make sure to publish to at least `mesh_n`
// peers (if possible).
let needed_extra_peers = self.config.mesh_n().saturating_sub(mesh_peers.len());

if needed_extra_peers > 0 {
// We don't have `mesh_n` peers in our mesh, we will randomly select extras
// and publish to them.

// Get a random set of peers that are appropriate to send messages too.
let peer_list = get_random_peers(
&self.connected_peers,
&topic_hash,
needed_extra_peers,
|peer| {
!mesh_peers.contains(peer)
&& !self.explicit_peers.contains(peer)
&& !self
.score_below_threshold(peer, |pst| pst.publish_threshold)
.0
},
);
recipient_peers.extend(peer_list);
}

recipient_peers.extend(mesh_peers);
}
// Gossipsub peers
Expand Down Expand Up @@ -729,10 +753,14 @@ where
}
}

if publish_failed {
if recipient_peers.is_empty() {
return Err(PublishError::InsufficientPeers);
}

if publish_failed {
return Err(PublishError::AllQueuesFull(recipient_peers.len()));
}

tracing::debug!(message=%msg_id, "Published message");

if let Some(metrics) = self.metrics.as_mut() {
Expand Down Expand Up @@ -2203,10 +2231,9 @@ where
if outbound <= self.config.mesh_outbound_min() {
// do not remove anymore outbound peers
continue;
} else {
// an outbound peer gets removed
outbound -= 1;
}
// an outbound peer gets removed
outbound -= 1;
}

// remove the peer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -741,8 +741,8 @@ fn test_publish_without_flood_publishing() {
let config: Config = Config::default();
assert_eq!(
publishes.len(),
config.mesh_n_low(),
"Should send a publish message to all known peers"
config.mesh_n(),
"Should send a publish message to at least mesh_n peers"
);

assert!(
Expand Down
3 changes: 3 additions & 0 deletions beacon_node/lighthouse_network/src/gossipsub/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ pub enum PublishError {
MessageTooLarge,
/// The compression algorithm failed.
TransformFailed(std::io::Error),
/// Messages could not be sent because all queues for peers were full. The usize represents the
/// number of peers that have full queues.
AllQueuesFull(usize),
}

impl std::fmt::Display for PublishError {
Expand Down

0 comments on commit fc8f1a4

Please sign in to comment.