Use grid topology for bitfileds distribution messages (#5389)

* Move NewGossipTopology -> SessionGridTopology outside as this implementation is shared

* Add method to return peers difference between topologies

* Implement basic grid topology usage for the bitfield distribution

* Fix tests

* Oops, fix tests

* Add some tests for random routing

* Add a unit test for topology distribution

* Store the current and the previous topology to match sessions boundaries

* Update tests

* Update node/network/bitfield-distribution/src/lib.rs

Co-authored-by: Andronik <write@reusable.software>

* Update node/network/protocol/src/grid_topology.rs

Co-authored-by: Andronik <write@reusable.software>

* Update node/network/bitfield-distribution/src/lib.rs

Co-authored-by: Andronik <write@reusable.software>

* Add some debug

* Fix tests as HashSet order is undefined

Co-authored-by: Andronik <write@reusable.software>
This commit is contained in:
Vsevolod Stakhov
2022-05-06 13:24:11 +01:00
committed by GitHub
parent 53a1db59bc
commit 673a32d968
9 changed files with 419 additions and 83 deletions
@@ -31,8 +31,8 @@ use polkadot_node_primitives::approval::{
};
use polkadot_node_subsystem::{
messages::{
network_bridge_event, ApprovalCheckResult, ApprovalDistributionMessage,
ApprovalVotingMessage, AssignmentCheckResult, NetworkBridgeEvent, NetworkBridgeMessage,
ApprovalCheckResult, ApprovalDistributionMessage, ApprovalVotingMessage,
AssignmentCheckResult, NetworkBridgeEvent, NetworkBridgeMessage,
},
overseer, ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, SubsystemContext,
SubsystemError,
@@ -145,29 +145,6 @@ impl Default for AggressionConfig {
}
}
struct ApprovalGridTopology(SessionGridTopology);
impl From<network_bridge_event::NewGossipTopology> for ApprovalGridTopology {
fn from(topology: network_bridge_event::NewGossipTopology) -> Self {
let peers_x =
topology.our_neighbors_x.values().flat_map(|p| &p.peer_ids).cloned().collect();
let peers_y =
topology.our_neighbors_y.values().flat_map(|p| &p.peer_ids).cloned().collect();
let validator_indices_x =
topology.our_neighbors_x.values().map(|p| p.validator_index.clone()).collect();
let validator_indices_y =
topology.our_neighbors_y.values().map(|p| p.validator_index.clone()).collect();
ApprovalGridTopology(SessionGridTopology {
peers_x,
peers_y,
validator_indices_x,
validator_indices_y,
})
}
}
#[derive(PartialEq)]
enum Resend {
Yes,
@@ -368,12 +345,8 @@ impl State {
},
NetworkBridgeEvent::NewGossipTopology(topology) => {
let session = topology.session;
self.handle_new_session_topology(
ctx,
session,
ApprovalGridTopology::from(topology),
)
.await;
self.handle_new_session_topology(ctx, session, SessionGridTopology::from(topology))
.await;
},
NetworkBridgeEvent::PeerViewChange(peer_id, view) => {
self.handle_peer_view_change(ctx, metrics, peer_id, view, rng).await;
@@ -528,9 +501,9 @@ impl State {
ctx: &mut (impl SubsystemContext<Message = ApprovalDistributionMessage>
+ overseer::SubsystemContext<Message = ApprovalDistributionMessage>),
session: SessionIndex,
topology: ApprovalGridTopology,
topology: SessionGridTopology,
) {
self.topologies.insert_topology(session, topology.0);
self.topologies.insert_topology(session, topology);
let topology = self.topologies.get_topology(session).expect("just inserted above; qed");
adjust_required_routing_and_propagate(
@@ -21,7 +21,7 @@ use polkadot_node_network_protocol::{our_view, view, ObservedRole};
use polkadot_node_primitives::approval::{
AssignmentCertKind, VRFOutput, VRFProof, RELAY_VRF_MODULO_CONTEXT,
};
use polkadot_node_subsystem::messages::{AllMessages, ApprovalCheckError};
use polkadot_node_subsystem::messages::{network_bridge_event, AllMessages, ApprovalCheckError};
use polkadot_node_subsystem_test_helpers as test_helpers;
use polkadot_node_subsystem_util::TimeoutExt as _;
use polkadot_primitives::v2::{AuthorityDiscoveryId, BlakeTwo256, HashT};