Send view to new peers (#2392)

* send our view to new peers immediately

* guide: update

* Fix tests by expecting the view updates

* Add test that we send our view on connection

Co-authored-by: Sergei Shulepov <sergei@parity.io>
This commit is contained in:
Robert Habermeier
2021-02-06 05:26:45 -06:00
committed by GitHub
parent 0ffee4f6ef
commit 31d9396395
2 changed files with 97 additions and 25 deletions
+96 -24
View File
@@ -306,26 +306,48 @@ where
}); });
match peer_set { match peer_set {
PeerSet::Validation => dispatch_validation_events_to_all( PeerSet::Validation => {
vec![ dispatch_validation_events_to_all(
NetworkBridgeEvent::PeerConnected(peer.clone(), role), vec![
NetworkBridgeEvent::PeerViewChange( NetworkBridgeEvent::PeerConnected(peer.clone(), role),
peer, NetworkBridgeEvent::PeerViewChange(
View::default(), peer.clone(),
View::default(),
),
],
&mut ctx,
).await;
send_message(
&mut bridge.network_service,
vec![peer],
PeerSet::Validation,
WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate(
local_view.clone()
), ),
], ).await?;
&mut ctx, }
).await, PeerSet::Collation => {
PeerSet::Collation => dispatch_collation_events_to_all( dispatch_collation_events_to_all(
vec![ vec![
NetworkBridgeEvent::PeerConnected(peer.clone(), role), NetworkBridgeEvent::PeerConnected(peer.clone(), role),
NetworkBridgeEvent::PeerViewChange( NetworkBridgeEvent::PeerViewChange(
peer, peer.clone(),
View::default(), View::default(),
),
],
&mut ctx,
).await;
send_message(
&mut bridge.network_service,
vec![peer],
PeerSet::Collation,
WireMessage::<protocol_v1::CollationProtocol>::ViewUpdate(
local_view.clone()
), ),
], ).await?;
&mut ctx, }
).await,
} }
} }
} }
@@ -831,6 +853,51 @@ mod tests {
) )
} }
#[test]
fn send_our_view_upon_connection() {
test_harness(|test_harness| async move {
let TestHarness {
mut network_handle,
mut virtual_overseer,
} = test_harness;
let peer = PeerId::random();
let head = Hash::repeat_byte(1);
virtual_overseer.send(
FromOverseer::Signal(OverseerSignal::ActiveLeaves(
ActiveLeavesUpdate::start_work(head, Arc::new(JaegerSpan::Disabled)),
))
).await;
network_handle.connect_peer(peer.clone(), PeerSet::Validation, ObservedRole::Full).await;
network_handle.connect_peer(peer.clone(), PeerSet::Collation, ObservedRole::Full).await;
let view = view![head];
let actions = network_handle.next_network_actions(2).await;
assert_network_actions_contains(
&actions,
&NetworkAction::WriteNotification(
peer.clone(),
PeerSet::Validation,
WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate(
view.clone(),
).encode(),
),
);
assert_network_actions_contains(
&actions,
&NetworkAction::WriteNotification(
peer.clone(),
PeerSet::Collation,
WireMessage::<protocol_v1::CollationProtocol>::ViewUpdate(
view.clone(),
).encode(),
),
);
});
}
#[test] #[test]
fn sends_view_updates_to_peers() { fn sends_view_updates_to_peers() {
test_harness(|test_harness| async move { test_harness(|test_harness| async move {
@@ -858,7 +925,7 @@ mod tests {
)) ))
).await; ).await;
let actions = network_handle.next_network_actions(2).await; let actions = network_handle.next_network_actions(4).await;
let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate( let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate(
view![hash_a] view![hash_a]
).encode(); ).encode();
@@ -920,7 +987,7 @@ mod tests {
)) ))
).await; ).await;
let actions = network_handle.next_network_actions(2).await; let actions = network_handle.next_network_actions(4).await;
let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate( let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate(
View { heads: vec![hash_a], finalized_number: 5 } View { heads: vec![hash_a], finalized_number: 5 }
).encode(); ).encode();
@@ -1110,7 +1177,7 @@ mod tests {
)) ))
).await; ).await;
let actions = network_handle.next_network_actions(1).await; let actions = network_handle.next_network_actions(3).await;
let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate( let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate(
view![hash_a] view![hash_a]
).encode(); ).encode();
@@ -1181,7 +1248,7 @@ mod tests {
WireMessage::ProtocolMessage(message.clone()).encode(), WireMessage::ProtocolMessage(message.clone()).encode(),
).await; ).await;
let actions = network_handle.next_network_actions(1).await; let actions = network_handle.next_network_actions(3).await;
assert_network_actions_contains( assert_network_actions_contains(
&actions, &actions,
&NetworkAction::ReputationChange( &NetworkAction::ReputationChange(
@@ -1302,7 +1369,7 @@ mod tests {
)) ))
).await; ).await;
let actions = network_handle.next_network_actions(1).await; let actions = network_handle.next_network_actions(2).await;
let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate( let wire_message = WireMessage::<protocol_v1::ValidationProtocol>::ViewUpdate(
View { View {
heads: vec![hash_b], heads: vec![hash_b],
@@ -1350,7 +1417,7 @@ mod tests {
).encode(), ).encode(),
).await; ).await;
let actions = network_handle.next_network_actions(1).await; let actions = network_handle.next_network_actions(2).await;
assert_network_actions_contains( assert_network_actions_contains(
&actions, &actions,
&NetworkAction::ReputationChange( &NetworkAction::ReputationChange(
@@ -1399,6 +1466,11 @@ mod tests {
).await; ).await;
} }
// consume peer view changes
{
let _peer_view_changes = network_handle.next_network_actions(2).await;
}
// send a validation protocol message. // send a validation protocol message.
{ {
@@ -67,7 +67,7 @@ We update our view's `finalized_number` to the provided one and delay `ProtocolM
### Network Event: Peer Connected ### Network Event: Peer Connected
Issue a `NetworkBridgeEvent::PeerConnected` for each [Event Handler](#event-handlers) of the peer-set and negotiated protocol version of the peer. Issue a `NetworkBridgeEvent::PeerConnected` for each [Event Handler](#event-handlers) of the peer-set and negotiated protocol version of the peer. Also issue a `NetworkBridgeEvent::PeerViewChange` and send the peer our current view.
### Network Event: Peer Disconnected ### Network Event: Peer Disconnected