simplification of peerset api (#2123)

* Introduction of PeersetHandle

* integrate PeersetHandle with the rest of the codebase

* fix compilation errors

* more tests for peerset, fixed overwriting bug in add_reserved_peer

* Slots data structure and bugfixes for peerset

* bend to pressure

* updated lru-cache to 0.1.2 and updated linked-hash-map to 0.5.2

* peerset discovered list is now a LinkedHashMap

* fix review suggestions

* split back Peerset and PeersetHandle

* test for Peerset::discovered

* applied review suggestions

* fixes to peerset::incoming

* peerset disconnects are all instantaneous

* instantaneous drop in peerset finished

* Peerset::set_reserved_only can also reconnect nodes

* Peerset scores cache uses lru-cache

* remove redundant function call and comment from Peerset::on_set_reserved_only

* add_peer returns SlotState enum

* apply review suggestions

* is_reserved -> is_connected_and_reserved
This commit is contained in:
Marek Kotewicz
2019-04-04 19:40:40 +02:00
committed by GitHub
parent 301844dd56
commit 1142bcde97
8 changed files with 741 additions and 193 deletions
@@ -58,7 +58,7 @@ impl<TMessage, TSubstream> Behaviour<TMessage, TSubstream> {
local_public_key: PublicKey,
protocol: RegisteredProtocol<TMessage>,
known_addresses: Vec<(PeerId, Multiaddr)>,
peerset: substrate_peerset::PeersetMut,
peerset: substrate_peerset::Peerset,
enable_mdns: bool,
) -> Self {
let identify = {
@@ -31,7 +31,7 @@ pub struct CustomProto<TMessage, TSubstream> {
protocol: RegisteredProtocol<TMessage>,
/// Receiver for instructions about who to connect to or disconnect from.
peerset: substrate_peerset::PeersetMut,
peerset: substrate_peerset::Peerset,
/// List of peers in our state.
peers: FnvHashMap<PeerId, PeerState>,
@@ -175,7 +175,7 @@ impl<TMessage, TSubstream> CustomProto<TMessage, TSubstream> {
/// Creates a `CustomProtos`.
pub fn new(
protocol: RegisteredProtocol<TMessage>,
peerset: substrate_peerset::PeersetMut,
peerset: substrate_peerset::Peerset,
) -> Self {
CustomProto {
protocol,
@@ -213,7 +213,7 @@ impl<TMessage, TSubstream> CustomProto<TMessage, TSubstream> {
// DisabledPendingEnable => Disabled.
PeerState::DisabledPendingEnable { open, connected_point, timer } => {
debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id);
self.peerset.dropped(peer_id);
self.peerset.dropped(peer_id.clone());
let banned_until = Some(if let Some(ban) = ban {
cmp::max(timer.deadline(), Instant::now() + ban)
} else {
@@ -225,7 +225,7 @@ impl<TMessage, TSubstream> CustomProto<TMessage, TSubstream> {
// Enabled => Disabled.
PeerState::Enabled { open, connected_point } => {
debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id);
self.peerset.dropped(peer_id);
self.peerset.dropped(peer_id.clone());
debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", peer_id);
self.events.push(NetworkBehaviourAction::SendEvent {
peer_id: peer_id.clone(),
@@ -484,7 +484,7 @@ impl<TMessage, TSubstream> CustomProto<TMessage, TSubstream> {
debug!(target: "sub-libp2p", "PSM => Accept({:?}, {:?}): Obsolete incoming,
sending back dropped", index, incoming.peer_id);
debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", incoming.peer_id);
self.peerset.dropped(&incoming.peer_id);
self.peerset.dropped(incoming.peer_id.clone());
return
}
@@ -662,7 +662,7 @@ where
debug!(target: "sub-libp2p", "Libp2p => Disconnected({:?}): Was disabled \
(through {:?}) but pending enable", peer_id, endpoint);
debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id);
self.peerset.dropped(peer_id);
self.peerset.dropped(peer_id.clone());
self.peers.insert(peer_id.clone(), PeerState::Banned { until: timer.deadline() });
if open {
debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id);
@@ -679,7 +679,7 @@ where
debug!(target: "sub-libp2p", "Libp2p => Disconnected({:?}): Was enabled \
(through {:?})", peer_id, endpoint);
debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id);
self.peerset.dropped(peer_id);
self.peerset.dropped(peer_id.clone());
if open {
debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id);
@@ -730,7 +730,7 @@ where
until: Instant::now() + Duration::from_secs(5)
};
debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id);
self.peerset.dropped(peer_id)
self.peerset.dropped(peer_id.clone())
},
// We can still get dial failures even if we are already connected to the node,
@@ -38,7 +38,7 @@ use std::time::Duration;
pub fn start_service<TMessage>(
config: NetworkConfiguration,
registered_custom: RegisteredProtocol<TMessage>,
) -> Result<(Service<TMessage>, Arc<substrate_peerset::Peerset>), IoError>
) -> Result<(Service<TMessage>, substrate_peerset::PeersetHandle), IoError>
where TMessage: CustomMessage + Send + 'static {
if let Some(ref path) = config.net_config_path {
@@ -72,7 +72,7 @@ where TMessage: CustomMessage + Send + 'static {
}
// Build the peerset.
let (peerset, peerset_receiver) = substrate_peerset::Peerset::from_config(substrate_peerset::PeersetConfig {
let (peerset, peerset_handle) = substrate_peerset::Peerset::from_config(substrate_peerset::PeersetConfig {
in_peers: config.in_peers,
out_peers: config.out_peers,
bootnodes,
@@ -88,7 +88,7 @@ where TMessage: CustomMessage + Send + 'static {
// Build the swarm.
let (mut swarm, bandwidth) = {
let user_agent = format!("{} ({})", config.client_version, config.node_name);
let behaviour = Behaviour::new(user_agent, local_public, registered_custom, known_addresses, peerset_receiver, config.enable_mdns);
let behaviour = Behaviour::new(user_agent, local_public, registered_custom, known_addresses, peerset, config.enable_mdns);
let (transport, bandwidth) = transport::build_transport(local_identity);
(Swarm::new(transport, behaviour, local_peer_id.clone()), bandwidth)
};
@@ -116,7 +116,7 @@ where TMessage: CustomMessage + Send + 'static {
injected_events: Vec::new(),
};
Ok((service, peerset))
Ok((service, peerset_handle))
}
/// Event produced by the service.