Skip to content

Commit 53b12a5

Browse files
committed
Code review: make DropPeer use a PeerAddress instead of event_id
Signed-off-by: Jacinta Ferrant <[email protected]>
1 parent 61cc9b6 commit 53b12a5

File tree

1 file changed

+115
-99
lines changed

1 file changed

+115
-99
lines changed

stackslib/src/net/p2p.rs

Lines changed: 115 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,8 @@ impl std::fmt::Display for DropReason {
364364
pub struct DropPeer {
365365
/// The reason for dropping the peer
366366
pub reason: DropReason,
367-
/// The event id of the peer
368-
pub event_id: usize,
367+
/// The address of the peer to drop
368+
pub address: PeerAddress,
369369
}
370370

371371
pub struct PeerNetwork {
@@ -1609,7 +1609,7 @@ impl PeerNetwork {
16091609
}
16101610

16111611
/// Process ban requests. Update the deny in the peer database. Return the vec of event IDs to disconnect from.
1612-
fn process_bans(&mut self) -> Result<Vec<usize>, net_error> {
1612+
fn process_bans(&mut self) -> Result<Vec<DropPeer>, net_error> {
16131613
if cfg!(test) && self.connection_opts.disable_network_bans {
16141614
return Ok(vec![]);
16151615
}
@@ -1642,7 +1642,10 @@ impl PeerNetwork {
16421642
}
16431643
};
16441644

1645-
disconnect.push(event_id);
1645+
disconnect.push(DropPeer {
1646+
address: neighbor_key.addrbytes,
1647+
reason: DropReason::BannedConnection,
1648+
});
16461649

16471650
let now = get_epoch_time_secs();
16481651
let penalty = if let Some(neighbor_info) = neighbor_info_opt {
@@ -1989,15 +1992,18 @@ impl PeerNetwork {
19891992

19901993
/// Deregister a socket/event pair
19911994
pub fn deregister_peer(&mut self, peer: DropPeer) {
1992-
let event_id = peer.event_id;
19931995
let reason = peer.reason;
1994-
debug!("{:?}: Disconnect event {}", &self.local_peer, event_id);
1996+
debug!(
1997+
"{:?}: Disconnect peer {}",
1998+
&self.local_peer,
1999+
peer.address.pretty_print()
2000+
);
19952001

1996-
let mut nk_remove: Vec<(NeighborKey, Hash160)> = vec![];
1997-
for (neighbor_key, ev_id) in self.events.iter() {
1998-
if *ev_id == event_id {
2002+
let mut nk_remove = vec![];
2003+
for (neighbor_key, event_id) in self.events.iter() {
2004+
if neighbor_key.addrbytes == peer.address {
19992005
let pubkh = self
2000-
.get_p2p_convo(event_id)
2006+
.get_p2p_convo(*event_id)
20012007
.and_then(|convo| convo.get_public_key_hash())
20022008
.unwrap_or(Hash160([0x00; 20]));
20032009
nk_remove.push((neighbor_key.clone(), pubkh));
@@ -2006,60 +2012,61 @@ impl PeerNetwork {
20062012

20072013
for (nk, pubkh) in nk_remove.into_iter() {
20082014
// remove event state
2009-
self.events.remove(&nk);
2010-
info!("Dropping neighbor!";
2011-
"event id" => %event_id,
2012-
"public key" => %pubkh,
2013-
"public addr" => %nk.addrbytes.pretty_print(),
2014-
"reason" => %reason
2015-
);
2016-
2017-
// remove inventory state
2018-
if let Some(inv_state) = self.inv_state.as_mut() {
2019-
debug!(
2020-
"{:?}: Remove inventory state for epoch 2.x {:?}",
2021-
&self.local_peer, &nk
2022-
);
2023-
inv_state.del_peer(&nk);
2024-
}
2025-
if let Some(inv_state) = self.inv_state_nakamoto.as_mut() {
2026-
debug!(
2027-
"{:?}: Remove inventory state for Nakamoto {:?}",
2028-
&self.local_peer, &nk
2015+
if let Some(event_id) = self.events.remove(&nk) {
2016+
info!("Dropping neighbor!";
2017+
"event id" => event_id,
2018+
"public key" => %pubkh,
2019+
"public addr" => nk.addrbytes.pretty_print(),
2020+
"reason" => %reason
20292021
);
2030-
inv_state.del_peer(&NeighborAddress::from_neighbor_key(nk.clone(), pubkh));
2031-
}
2032-
self.pending_messages.remove(&(event_id, nk.clone()));
2033-
self.pending_stacks_messages.remove(&(event_id, nk.clone()));
2034-
}
2035-
2036-
match self.network {
2037-
None => {}
2038-
Some(ref mut network) => {
2039-
// deregister socket if connected and registered already
2040-
if let Some(socket) = self.sockets.remove(&event_id) {
2041-
let _ = network.deregister(event_id, &socket);
2022+
// remove inventory state
2023+
if let Some(inv_state) = self.inv_state.as_mut() {
2024+
debug!(
2025+
"{:?}: Remove inventory state for epoch 2.x {nk:?}",
2026+
&self.local_peer
2027+
);
2028+
inv_state.del_peer(&nk);
2029+
}
2030+
if let Some(inv_state) = self.inv_state_nakamoto.as_mut() {
2031+
debug!(
2032+
"{:?}: Remove inventory state for Nakamoto {nk:?}",
2033+
&self.local_peer
2034+
);
2035+
inv_state.del_peer(&NeighborAddress::from_neighbor_key(nk.clone(), pubkh));
20422036
}
2043-
// deregister socket if still connecting
2044-
if let Some(ConnectingPeer { socket, .. }) = self.connecting.remove(&event_id) {
2045-
let _ = network.deregister(event_id, &socket);
2037+
self.pending_messages.remove(&(event_id, nk.clone()));
2038+
self.pending_stacks_messages.remove(&(event_id, nk.clone()));
2039+
2040+
match self.network {
2041+
None => {}
2042+
Some(ref mut network) => {
2043+
// deregister socket if connected and registered already
2044+
if let Some(socket) = self.sockets.remove(&event_id) {
2045+
let _ = network.deregister(event_id, &socket);
2046+
}
2047+
// deregister socket if still connecting
2048+
if let Some(ConnectingPeer { socket, .. }) =
2049+
self.connecting.remove(&event_id)
2050+
{
2051+
let _ = network.deregister(event_id, &socket);
2052+
}
2053+
}
20462054
}
2055+
self.relay_handles.remove(&event_id);
2056+
self.peers.remove(&event_id);
20472057
}
20482058
}
2049-
2050-
self.relay_handles.remove(&event_id);
2051-
self.peers.remove(&event_id);
20522059
}
20532060

20542061
/// Deregister by neighbor key
20552062
pub fn deregister_neighbor(&mut self, neighbor: &NeighborKey, reason: DropReason) {
20562063
debug!("Disconnect from {neighbor:?}");
2057-
let Some(event_id) = self.events.get(neighbor) else {
2064+
if !self.events.contains_key(neighbor) {
20582065
return;
20592066
};
20602067
self.deregister_peer(DropPeer {
2061-
event_id: *event_id,
20622068
reason,
2069+
address: neighbor.addrbytes,
20632070
});
20642071
}
20652072

@@ -2071,8 +2078,11 @@ impl PeerNetwork {
20712078
*event_id
20722079
});
20732080
self.relayer_stats.process_neighbor_ban(&neighbor);
2074-
if let Some(event_id) = event_id {
2075-
self.deregister_peer(DropPeer { event_id, reason });
2081+
if event_id.is_some() {
2082+
self.deregister_peer(DropPeer {
2083+
reason,
2084+
address: neighbor.addrbytes,
2085+
});
20762086
}
20772087
}
20782088

@@ -2343,29 +2353,33 @@ impl PeerNetwork {
23432353
) {
23442354
Ok((convo_unhandled, alive)) => (convo_unhandled, alive),
23452355
Err(e) => {
2356+
let convo = self.get_p2p_convo(*event_id);
23462357
debug!(
2347-
"{:?}: Connection to {:?} failed: {e:?}",
2358+
"{:?}: Connection to {convo:?} failed: {e:?}",
23482359
&self.local_peer,
2349-
self.get_p2p_convo(*event_id)
23502360
);
2351-
to_remove.push(DropPeer {
2352-
event_id: *event_id,
2353-
reason: DropReason::BrokenConnection(Some(e.to_string())),
2354-
});
2361+
if let Some(convo) = convo {
2362+
to_remove.push(DropPeer {
2363+
address: convo.peer_addrbytes,
2364+
reason: DropReason::BrokenConnection(Some(e.to_string())),
2365+
});
2366+
}
23552367
continue;
23562368
}
23572369
};
23582370

23592371
if !alive {
2372+
let convo = self.get_p2p_convo(*event_id);
23602373
debug!(
2361-
"{:?}: Connection to {:?} is no longer alive",
2362-
&self.local_peer,
2363-
self.get_p2p_convo(*event_id),
2374+
"{:?}: Connection to {convo:?} is no longer alive",
2375+
&self.local_peer
23642376
);
2365-
to_remove.push(DropPeer {
2366-
event_id: *event_id,
2367-
reason: DropReason::DeadConnection,
2368-
});
2377+
if let Some(convo) = convo {
2378+
to_remove.push(DropPeer {
2379+
address: convo.peer_addrbytes,
2380+
reason: DropReason::DeadConnection,
2381+
});
2382+
}
23692383
}
23702384

23712385
// forward along unhandled messages from this peer
@@ -2471,7 +2485,7 @@ impl PeerNetwork {
24712485
now
24722486
);
24732487
to_remove.push(DropPeer {
2474-
event_id: *event_id,
2488+
address: peer.nk.addrbytes,
24752489
reason: DropReason::Unresponsive {
24762490
timeout: self.connection_opts.timeout,
24772491
last_seen: peer.timestamp,
@@ -2481,7 +2495,7 @@ impl PeerNetwork {
24812495
}
24822496
}
24832497

2484-
for (event_id, convo) in self.peers.iter() {
2498+
for convo in self.peers.values() {
24852499
if convo.is_authenticated() && convo.stats.last_contact_time > 0 {
24862500
// have handshaked with this remote peer
24872501
if convo.stats.last_contact_time
@@ -2501,7 +2515,7 @@ impl PeerNetwork {
25012515
);
25022516

25032517
to_remove.push(DropPeer {
2504-
event_id: *event_id,
2518+
address: convo.peer_addrbytes,
25052519
reason: DropReason::Unresponsive {
25062520
timeout: self.connection_opts.timeout,
25072521
last_seen: convo.peer_heartbeat.into(),
@@ -2522,7 +2536,7 @@ impl PeerNetwork {
25222536
);
25232537

25242538
to_remove.push(DropPeer {
2525-
event_id: *event_id,
2539+
address: convo.peer_addrbytes,
25262540
reason: DropReason::Unresponsive {
25272541
timeout: self.connection_opts.timeout,
25282542
last_seen: convo.instantiated,
@@ -2714,12 +2728,14 @@ impl PeerNetwork {
27142728
Ok(Err(e)) | Err(e) => {
27152729
// connection broken; next list
27162730
debug!("Relay handle broken to event {event_id}");
2717-
broken.push(DropPeer {
2718-
event_id: *event_id,
2719-
reason: DropReason::BrokenConnection(Some(format!(
2720-
"Relay handle broken: {e}"
2721-
))),
2722-
});
2731+
if let Some(peer) = self.peers.get(event_id) {
2732+
broken.push(DropPeer {
2733+
address: peer.peer_addrbytes,
2734+
reason: DropReason::BrokenConnection(Some(format!(
2735+
"Relay handle broken: {e}"
2736+
))),
2737+
});
2738+
}
27232739
break;
27242740
}
27252741
};
@@ -2858,14 +2874,14 @@ impl PeerNetwork {
28582874

28592875
/// Disconnect from all peers
28602876
fn disconnect_all(&mut self, reason: DropReason) {
2861-
let mut all_event_ids = vec![];
2862-
for (eid, _) in self.peers.iter() {
2863-
all_event_ids.push(*eid);
2864-
}
2865-
2866-
for eid in all_event_ids.into_iter() {
2877+
let addresses: Vec<_> = self
2878+
.peers
2879+
.values()
2880+
.map(|convo| convo.peer_addrbytes)
2881+
.collect();
2882+
for address in addresses {
28672883
self.deregister_peer(DropPeer {
2868-
event_id: eid,
2884+
address,
28692885
reason: reason.clone(),
28702886
});
28712887
}
@@ -4915,19 +4931,20 @@ impl PeerNetwork {
49154931
let unauthenticated_inbounds = self.find_unauthenticated_inbound_convos();
49164932

49174933
// run existing conversations, clear out broken ones, and get back messages forwarded to us
4918-
let (error_events, unsolicited_messages) = self.process_ready_sockets(
4934+
let (drop_peers, unsolicited_messages) = self.process_ready_sockets(
49194935
sortdb,
49204936
chainstate,
49214937
&mut dns_client_opt,
49224938
&mut poll_state,
49234939
ibd,
49244940
);
4925-
for error_event in error_events {
4941+
for peer in drop_peers {
49264942
debug!(
4927-
"{:?}: Failed connection on event {}",
4928-
&self.local_peer, error_event.event_id
4943+
"{:?}: Failed connection on peer {}",
4944+
&self.local_peer,
4945+
peer.address.pretty_print()
49294946
);
4930-
self.deregister_peer(error_event);
4947+
self.deregister_peer(peer);
49314948
}
49324949

49334950
// filter out unsolicited messages and buffer up ones that might become processable
@@ -4963,16 +4980,14 @@ impl PeerNetwork {
49634980
// prune back our connections if it's been a while
49644981
// (only do this if we're done with all other tasks).
49654982
// Also, process banned peers.
4966-
if let Ok(dead_events) = self.process_bans() {
4967-
for dead in dead_events.into_iter() {
4983+
if let Ok(banned_peers) = self.process_bans() {
4984+
for peer in banned_peers.into_iter() {
49684985
debug!(
4969-
"{:?}: Banned connection on event {}",
4970-
&self.local_peer, dead
4986+
"{:?}: Banned connection on {}",
4987+
&self.local_peer,
4988+
peer.address.pretty_print()
49714989
);
4972-
self.deregister_peer(DropPeer {
4973-
event_id: dead,
4974-
reason: DropReason::BannedConnection,
4975-
});
4990+
self.deregister_peer(peer);
49764991
}
49774992
}
49784993
self.prune_connections();
@@ -5016,11 +5031,12 @@ impl PeerNetwork {
50165031
self.queue_ping_heartbeats();
50175032

50185033
// move conversations along
5019-
let to_drop = self.flush_relay_handles();
5020-
for peer in to_drop {
5034+
let drop_peers = self.flush_relay_handles();
5035+
for peer in drop_peers {
50215036
debug!(
5022-
"{:?}: Failed connection on event {}",
5023-
&self.local_peer, peer.event_id,
5037+
"{:?}: Failed connection on peer {}",
5038+
&self.local_peer,
5039+
peer.address.pretty_print(),
50245040
);
50255041
self.deregister_peer(peer);
50265042
}

0 commit comments

Comments
 (0)