@@ -364,8 +364,8 @@ impl std::fmt::Display for DropReason {
364
364
pub struct DropPeer {
365
365
/// The reason for dropping the peer
366
366
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 ,
369
369
}
370
370
371
371
pub struct PeerNetwork {
@@ -1609,7 +1609,7 @@ impl PeerNetwork {
1609
1609
}
1610
1610
1611
1611
/// 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 > {
1613
1613
if cfg ! ( test) && self . connection_opts . disable_network_bans {
1614
1614
return Ok ( vec ! [ ] ) ;
1615
1615
}
@@ -1642,7 +1642,10 @@ impl PeerNetwork {
1642
1642
}
1643
1643
} ;
1644
1644
1645
- disconnect. push ( event_id) ;
1645
+ disconnect. push ( DropPeer {
1646
+ address : neighbor_key. addrbytes ,
1647
+ reason : DropReason :: BannedConnection ,
1648
+ } ) ;
1646
1649
1647
1650
let now = get_epoch_time_secs ( ) ;
1648
1651
let penalty = if let Some ( neighbor_info) = neighbor_info_opt {
@@ -1989,15 +1992,18 @@ impl PeerNetwork {
1989
1992
1990
1993
/// Deregister a socket/event pair
1991
1994
pub fn deregister_peer ( & mut self , peer : DropPeer ) {
1992
- let event_id = peer. event_id ;
1993
1995
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
+ ) ;
1995
2001
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 {
1999
2005
let pubkh = self
2000
- . get_p2p_convo ( event_id)
2006
+ . get_p2p_convo ( * event_id)
2001
2007
. and_then ( |convo| convo. get_public_key_hash ( ) )
2002
2008
. unwrap_or ( Hash160 ( [ 0x00 ; 20 ] ) ) ;
2003
2009
nk_remove. push ( ( neighbor_key. clone ( ) , pubkh) ) ;
@@ -2006,60 +2012,61 @@ impl PeerNetwork {
2006
2012
2007
2013
for ( nk, pubkh) in nk_remove. into_iter ( ) {
2008
2014
// 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
2029
2021
) ;
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) ) ;
2042
2036
}
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
+ }
2046
2054
}
2055
+ self . relay_handles . remove ( & event_id) ;
2056
+ self . peers . remove ( & event_id) ;
2047
2057
}
2048
2058
}
2049
-
2050
- self . relay_handles . remove ( & event_id) ;
2051
- self . peers . remove ( & event_id) ;
2052
2059
}
2053
2060
2054
2061
/// Deregister by neighbor key
2055
2062
pub fn deregister_neighbor ( & mut self , neighbor : & NeighborKey , reason : DropReason ) {
2056
2063
debug ! ( "Disconnect from {neighbor:?}" ) ;
2057
- let Some ( event_id ) = self . events . get ( neighbor) else {
2064
+ if ! self . events . contains_key ( neighbor) {
2058
2065
return ;
2059
2066
} ;
2060
2067
self . deregister_peer ( DropPeer {
2061
- event_id : * event_id,
2062
2068
reason,
2069
+ address : neighbor. addrbytes ,
2063
2070
} ) ;
2064
2071
}
2065
2072
@@ -2071,8 +2078,11 @@ impl PeerNetwork {
2071
2078
* event_id
2072
2079
} ) ;
2073
2080
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
+ } ) ;
2076
2086
}
2077
2087
}
2078
2088
@@ -2343,29 +2353,33 @@ impl PeerNetwork {
2343
2353
) {
2344
2354
Ok ( ( convo_unhandled, alive) ) => ( convo_unhandled, alive) ,
2345
2355
Err ( e) => {
2356
+ let convo = self . get_p2p_convo ( * event_id) ;
2346
2357
debug ! (
2347
- "{:?}: Connection to {:?} failed: {e:?}" ,
2358
+ "{:?}: Connection to {convo :?} failed: {e:?}" ,
2348
2359
& self . local_peer,
2349
- self . get_p2p_convo( * event_id)
2350
2360
) ;
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
+ }
2355
2367
continue ;
2356
2368
}
2357
2369
} ;
2358
2370
2359
2371
if !alive {
2372
+ let convo = self . get_p2p_convo ( * event_id) ;
2360
2373
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
2364
2376
) ;
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
+ }
2369
2383
}
2370
2384
2371
2385
// forward along unhandled messages from this peer
@@ -2471,7 +2485,7 @@ impl PeerNetwork {
2471
2485
now
2472
2486
) ;
2473
2487
to_remove. push ( DropPeer {
2474
- event_id : * event_id ,
2488
+ address : peer . nk . addrbytes ,
2475
2489
reason : DropReason :: Unresponsive {
2476
2490
timeout : self . connection_opts . timeout ,
2477
2491
last_seen : peer. timestamp ,
@@ -2481,7 +2495,7 @@ impl PeerNetwork {
2481
2495
}
2482
2496
}
2483
2497
2484
- for ( event_id , convo) in self . peers . iter ( ) {
2498
+ for convo in self . peers . values ( ) {
2485
2499
if convo. is_authenticated ( ) && convo. stats . last_contact_time > 0 {
2486
2500
// have handshaked with this remote peer
2487
2501
if convo. stats . last_contact_time
@@ -2501,7 +2515,7 @@ impl PeerNetwork {
2501
2515
) ;
2502
2516
2503
2517
to_remove. push ( DropPeer {
2504
- event_id : * event_id ,
2518
+ address : convo . peer_addrbytes ,
2505
2519
reason : DropReason :: Unresponsive {
2506
2520
timeout : self . connection_opts . timeout ,
2507
2521
last_seen : convo. peer_heartbeat . into ( ) ,
@@ -2522,7 +2536,7 @@ impl PeerNetwork {
2522
2536
) ;
2523
2537
2524
2538
to_remove. push ( DropPeer {
2525
- event_id : * event_id ,
2539
+ address : convo . peer_addrbytes ,
2526
2540
reason : DropReason :: Unresponsive {
2527
2541
timeout : self . connection_opts . timeout ,
2528
2542
last_seen : convo. instantiated ,
@@ -2714,12 +2728,14 @@ impl PeerNetwork {
2714
2728
Ok ( Err ( e) ) | Err ( e) => {
2715
2729
// connection broken; next list
2716
2730
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
+ }
2723
2739
break ;
2724
2740
}
2725
2741
} ;
@@ -2858,14 +2874,14 @@ impl PeerNetwork {
2858
2874
2859
2875
/// Disconnect from all peers
2860
2876
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 {
2867
2883
self . deregister_peer ( DropPeer {
2868
- event_id : eid ,
2884
+ address ,
2869
2885
reason : reason. clone ( ) ,
2870
2886
} ) ;
2871
2887
}
@@ -4915,19 +4931,20 @@ impl PeerNetwork {
4915
4931
let unauthenticated_inbounds = self . find_unauthenticated_inbound_convos ( ) ;
4916
4932
4917
4933
// 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 (
4919
4935
sortdb,
4920
4936
chainstate,
4921
4937
& mut dns_client_opt,
4922
4938
& mut poll_state,
4923
4939
ibd,
4924
4940
) ;
4925
- for error_event in error_events {
4941
+ for peer in drop_peers {
4926
4942
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( )
4929
4946
) ;
4930
- self . deregister_peer ( error_event ) ;
4947
+ self . deregister_peer ( peer ) ;
4931
4948
}
4932
4949
4933
4950
// filter out unsolicited messages and buffer up ones that might become processable
@@ -4963,16 +4980,14 @@ impl PeerNetwork {
4963
4980
// prune back our connections if it's been a while
4964
4981
// (only do this if we're done with all other tasks).
4965
4982
// 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 ( ) {
4968
4985
debug ! (
4969
- "{:?}: Banned connection on event {}" ,
4970
- & self . local_peer, dead
4986
+ "{:?}: Banned connection on {}" ,
4987
+ & self . local_peer,
4988
+ peer. address. pretty_print( )
4971
4989
) ;
4972
- self . deregister_peer ( DropPeer {
4973
- event_id : dead,
4974
- reason : DropReason :: BannedConnection ,
4975
- } ) ;
4990
+ self . deregister_peer ( peer) ;
4976
4991
}
4977
4992
}
4978
4993
self . prune_connections ( ) ;
@@ -5016,11 +5031,12 @@ impl PeerNetwork {
5016
5031
self . queue_ping_heartbeats ( ) ;
5017
5032
5018
5033
// 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 {
5021
5036
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( ) ,
5024
5040
) ;
5025
5041
self . deregister_peer ( peer) ;
5026
5042
}
0 commit comments