mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-23 06:41:34 +00:00
protocols/gossipsub: Improve bandwidth (#2327)
This PR adds some bandwidth improvements to gossipsub. After a bit of inspection on live networks a number of improvements have been made that can help reduce unnecessary bandwidth on gossipsub networks. This PR introduces the following: - A 1:1 tracking of all in-flight IWANT requests. This not only ensures that all IWANT requests are answered and peers penalized accordingly, but gossipsub will no no longer create multiple IWANT requests for multiple peers. Previously, gossipsub sampled the in-flight IWANT requests in order to penalize peers for not responding with a high probability that we would detect non-responsive nodes. Futher, it was possible to re-request IWANT messages that are already being requested causing added duplication in messages and wasted unnecessary IWANT control messages. This PR shifts this logic to only request message ids that we are not currently requesting from peers. - Triangle routing naturally gives rise to unnecessary duplicates. Consider a mesh of 4 peers that are interconnected. Peer 1 sends a new message to 2,3,4. 2 propagates to 3,4 and 3 propagates to 2,4 and 4 propagates to 2,3. In this case 3 has received the message 3 times. If we keep track of peers that send us messages, when publishing or forwarding we no longer send to peers that have sent us a duplicate, we can eliminate one of the sends in the scenario above. This only occurs when message validation is async however. This PR adds this logic to remove some elements of triangle-routing duplicates. Co-authored-by: Divma <26765164+divagant-martian@users.noreply.github.com> Co-authored-by: Max Inden <mail@max-inden.de> Co-authored-by: Diva M <divma@protonmail.com>
This commit is contained in:
@ -758,12 +758,12 @@ impl GossipsubConfigBuilder {
|
||||
);
|
||||
}
|
||||
|
||||
if !(self.config.mesh_outbound_min < self.config.mesh_n_low
|
||||
if !(self.config.mesh_outbound_min <= self.config.mesh_n_low
|
||||
&& self.config.mesh_n_low <= self.config.mesh_n
|
||||
&& self.config.mesh_n <= self.config.mesh_n_high)
|
||||
{
|
||||
return Err("The following inequality doesn't hold \
|
||||
mesh_outbound_min < mesh_n_low <= mesh_n <= mesh_n_high");
|
||||
mesh_outbound_min <= mesh_n_low <= mesh_n <= mesh_n_high");
|
||||
}
|
||||
|
||||
if self.config.mesh_outbound_min * 2 > self.config.mesh_n {
|
||||
|
Reference in New Issue
Block a user