Evict inactive peers from the collator protocol peer-set (#2680)

* malicious reputation cost is fatal

* make ReportBad a malicious cost

* futures control-flow for cleaning up inactive collator peers

* guide: network bridge updates

* add `PeerDisconnected` message

* guide: update

* reverse order

* remember to match

* implement disconnect peer in network bridge

* implement disconnect_inactive_peers

* test

* remove println

* don't hardcore policy

* add fuse outside of loop

* use default eviction policy
This commit is contained in:
Robert Habermeier
2021-03-24 13:32:28 +01:00
committed by GitHub
parent 0f8b6f2f6e
commit b8867d71bc
12 changed files with 437 additions and 38 deletions
@@ -90,6 +90,8 @@ where
pub enum NetworkAction {
/// Note a change in reputation for a peer.
ReputationChange(PeerId, Rep),
/// Disconnect a peer from the given peer-set.
DisconnectPeer(PeerId, PeerSet),
/// Write a notification to a given peer on the given peer-set.
WriteNotification(PeerId, PeerSet, Vec<u8>),
}
@@ -130,6 +132,20 @@ pub trait Network: Send + 'static {
.boxed()
}
/// Disconnect a given peer from the peer set specified without harming reputation.
fn disconnect_peer(
&mut self,
who: PeerId,
peer_set: PeerSet,
) -> BoxFuture<SubsystemResult<()>> {
async move {
self.action_sink()
.send(NetworkAction::DisconnectPeer(who, peer_set))
.await
}
.boxed()
}
/// Write a notification to a peer on the given peer-set's protocol.
fn write_notification(
&mut self,
@@ -179,6 +195,9 @@ impl Network for Arc<NetworkService<Block, Hash>> {
);
self.0.report_peer(peer, cost_benefit.into_base_rep())
}
NetworkAction::DisconnectPeer(peer, peer_set) => self
.0
.disconnect_peer(peer, peer_set.into_protocol_name()),
NetworkAction::WriteNotification(peer, peer_set, message) => self
.0
.write_notification(peer, peer_set.into_protocol_name(), message),