Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit ae3dabb

Browse files
authored
Introduce sc_peerset::DropReason (#7996)
* Introduce sc_peerset::DropReason * Fix peerset tests
1 parent 68d7157 commit ae3dabb

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

client/network/src/protocol/generic_proto/behaviour.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ impl GenericProto {
469469
timer: _
470470
} => {
471471
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id);
472-
self.peerset.dropped(set_id, peer_id.clone());
472+
self.peerset.dropped(set_id, peer_id.clone(), sc_peerset::DropReason::Unknown);
473473
let backoff_until = Some(if let Some(ban) = ban {
474474
cmp::max(timer_deadline, Instant::now() + ban)
475475
} else {
@@ -486,7 +486,7 @@ impl GenericProto {
486486
// If relevant, the external API is instantly notified.
487487
PeerState::Enabled { mut connections } => {
488488
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id);
489-
self.peerset.dropped(set_id, peer_id.clone());
489+
self.peerset.dropped(set_id, peer_id.clone(), sc_peerset::DropReason::Unknown);
490490

491491
if connections.iter().any(|(_, s)| matches!(s, ConnectionState::Open(_))) {
492492
debug!(target: "sub-libp2p", "External API <= Closed({}, {:?})", peer_id, set_id);
@@ -942,7 +942,7 @@ impl GenericProto {
942942
_ => {
943943
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})",
944944
incoming.peer_id, incoming.set_id);
945-
self.peerset.dropped(incoming.set_id, incoming.peer_id);
945+
self.peerset.dropped(incoming.set_id, incoming.peer_id, sc_peerset::DropReason::Unknown);
946946
},
947947
}
948948
return
@@ -1184,7 +1184,7 @@ impl NetworkBehaviour for GenericProto {
11841184

11851185
if connections.is_empty() {
11861186
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id);
1187-
self.peerset.dropped(set_id, peer_id.clone());
1187+
self.peerset.dropped(set_id, peer_id.clone(), sc_peerset::DropReason::Unknown);
11881188
*entry.get_mut() = PeerState::Backoff { timer, timer_deadline };
11891189

11901190
} else {
@@ -1324,7 +1324,7 @@ impl NetworkBehaviour for GenericProto {
13241324

13251325
if connections.is_empty() {
13261326
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id);
1327-
self.peerset.dropped(set_id, peer_id.clone());
1327+
self.peerset.dropped(set_id, peer_id.clone(), sc_peerset::DropReason::Unknown);
13281328
let ban_dur = Uniform::new(5, 10).sample(&mut rand::thread_rng());
13291329

13301330
let delay_id = self.next_delay_id;
@@ -1345,7 +1345,7 @@ impl NetworkBehaviour for GenericProto {
13451345
matches!(s, ConnectionState::Opening | ConnectionState::Open(_)))
13461346
{
13471347
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id);
1348-
self.peerset.dropped(set_id, peer_id.clone());
1348+
self.peerset.dropped(set_id, peer_id.clone(), sc_peerset::DropReason::Unknown);
13491349

13501350
*entry.get_mut() = PeerState::Disabled {
13511351
connections,
@@ -1396,7 +1396,7 @@ impl NetworkBehaviour for GenericProto {
13961396
st @ PeerState::Requested |
13971397
st @ PeerState::PendingRequest { .. } => {
13981398
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id);
1399-
self.peerset.dropped(set_id, peer_id.clone());
1399+
self.peerset.dropped(set_id, peer_id.clone(), sc_peerset::DropReason::Unknown);
14001400

14011401
let now = Instant::now();
14021402
let ban_duration = match st {
@@ -1682,7 +1682,7 @@ impl NetworkBehaviour for GenericProto {
16821682
// List of open connections wasn't empty before but now it is.
16831683
if !connections.iter().any(|(_, s)| matches!(s, ConnectionState::Opening)) {
16841684
debug!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", source, set_id);
1685-
self.peerset.dropped(set_id, source.clone());
1685+
self.peerset.dropped(set_id, source.clone(), sc_peerset::DropReason::Refused);
16861686
*entry.into_mut() = PeerState::Disabled {
16871687
connections, backoff_until: None
16881688
};
@@ -1846,7 +1846,7 @@ impl NetworkBehaviour for GenericProto {
18461846
matches!(s, ConnectionState::Opening | ConnectionState::Open(_)))
18471847
{
18481848
debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", source);
1849-
self.peerset.dropped(set_id, source.clone());
1849+
self.peerset.dropped(set_id, source.clone(), sc_peerset::DropReason::Refused);
18501850

18511851
*entry.into_mut() = PeerState::Disabled {
18521852
connections,

client/peerset/src/lib.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ impl Peerset {
604604
///
605605
/// Must only be called after the PSM has either generated a `Connect` message with this
606606
/// `PeerId`, or accepted an incoming connection with this `PeerId`.
607-
pub fn dropped(&mut self, set_id: SetId, peer_id: PeerId) {
607+
pub fn dropped(&mut self, set_id: SetId, peer_id: PeerId, reason: DropReason) {
608608
// We want reputations to be up-to-date before adjusting them.
609609
self.update_time();
610610

@@ -620,6 +620,10 @@ impl Peerset {
620620
error!(target: "peerset", "Received dropped() for non-connected node"),
621621
}
622622

623+
if let DropReason::Refused = reason {
624+
self.on_remove_from_peers_set(set_id, peer_id);
625+
}
626+
623627
self.alloc_slots();
624628
}
625629

@@ -704,6 +708,17 @@ impl Stream for Peerset {
704708
}
705709
}
706710

711+
/// Reason for calling [`Peerset::dropped`].
712+
pub enum DropReason {
713+
/// Substream or connection has been closed for an unknown reason.
714+
Unknown,
715+
/// Substream or connection has been explicitly refused by the target. In other words, the
716+
/// peer doesn't actually belong to this set.
717+
///
718+
/// This has the side effect of calling [`PeersetHandle::remove_from_peers_set`].
719+
Refused,
720+
}
721+
707722
#[cfg(test)]
708723
mod tests {
709724
use libp2p::PeerId;

client/peerset/tests/fuzz.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use futures::prelude::*;
2020
use libp2p::PeerId;
2121
use rand::distributions::{Distribution, Uniform, WeightedIndex};
2222
use rand::seq::IteratorRandom;
23-
use sc_peerset::{IncomingIndex, Message, Peerset, PeersetConfig, ReputationChange, SetConfig, SetId};
23+
use sc_peerset::{DropReason, IncomingIndex, Message, Peerset, PeersetConfig, ReputationChange, SetConfig, SetId};
2424
use std::{collections::HashMap, collections::HashSet, pin::Pin, task::Poll};
2525

2626
#[test]
@@ -130,7 +130,7 @@ fn test_once() {
130130
3 => {
131131
if let Some(id) = connected_nodes.iter().choose(&mut rng).cloned() {
132132
connected_nodes.remove(&id);
133-
peerset.dropped(SetId::from(0), id);
133+
peerset.dropped(SetId::from(0), id, DropReason::Unknown);
134134
}
135135
}
136136

0 commit comments

Comments
 (0)