@@ -18,7 +18,7 @@ use util::byte_utils;
1818use util:: events:: { MessageSendEvent , MessageSendEventsProvider } ;
1919use util:: logger:: Logger ;
2020
21- use std:: collections:: { HashMap , hash_map, HashSet , LinkedList } ;
21+ use std:: collections:: { HashMap , hash_map, LinkedList } ;
2222use std:: sync:: { Arc , Mutex } ;
2323use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
2424use std:: { cmp, error, hash, fmt} ;
@@ -120,6 +120,10 @@ struct Peer {
120120 sync_status : InitSyncTracker ,
121121
122122 awaiting_pong : bool ,
123+
124+ /// Indicates do_read_event() pushed a message into pending_outbound_buffer but didn't call
125+ /// do_attempt_write_data() to avoid reentrancy. Cleared in process_events().
126+ needing_send : bool ,
123127}
124128
125129impl Peer {
@@ -140,9 +144,6 @@ impl Peer {
140144
141145struct PeerHolder < Descriptor : SocketDescriptor > {
142146 peers : HashMap < Descriptor , Peer > ,
143- /// Added to by do_read_event for cases where we pushed a message onto the send buffer but
144- /// didn't call do_attempt_write_data to avoid reentrancy. Cleared in process_events()
145- peers_needing_send : HashSet < Descriptor > ,
146147 /// Only add to this set when noise completes:
147148 node_id_to_descriptor : HashMap < PublicKey , Descriptor > ,
148149}
@@ -228,7 +229,6 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
228229 message_handler : message_handler,
229230 peers : Mutex :: new ( PeerHolder {
230231 peers : HashMap :: new ( ) ,
231- peers_needing_send : HashSet :: new ( ) ,
232232 node_id_to_descriptor : HashMap :: new ( )
233233 } ) ,
234234 our_node_secret : our_node_secret,
@@ -299,6 +299,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
299299 sync_status : InitSyncTracker :: NoSyncRequested ,
300300
301301 awaiting_pong : false ,
302+ needing_send : false ,
302303 } ) . is_some ( ) {
303304 panic ! ( "PeerManager driver duplicated descriptors!" ) ;
304305 } ;
@@ -336,6 +337,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
336337 sync_status : InitSyncTracker :: NoSyncRequested ,
337338
338339 awaiting_pong : false ,
340+ needing_send : false ,
339341 } ) . is_some ( ) {
340342 panic ! ( "PeerManager driver duplicated descriptors!" ) ;
341343 } ;
@@ -485,7 +487,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
485487 {
486488 log_trace!( self , "Encoding and sending message of type {} to {}" , $msg_code, log_pubkey!( peer. their_node_id. unwrap( ) ) ) ;
487489 peer. pending_outbound_buffer. push_back( peer. channel_encryptor. encrypt_message( & encode_msg!( $msg, $msg_code) [ ..] ) ) ;
488- peers . peers_needing_send . insert ( peer_descriptor . clone ( ) ) ;
490+ peer . needing_send = true ;
489491 }
490492 }
491493 }
@@ -644,7 +646,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
644646
645647 if msg. features . initial_routing_sync ( ) {
646648 peer. sync_status = InitSyncTracker :: ChannelsSyncing ( 0 ) ;
647- peers . peers_needing_send . insert ( peer_descriptor . clone ( ) ) ;
649+ peer . needing_send = true ;
648650 }
649651
650652 if !peer. outbound {
@@ -1029,7 +1031,6 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
10291031 match * action {
10301032 msgs:: ErrorAction :: DisconnectPeer { ref msg } => {
10311033 if let Some ( mut descriptor) = peers. node_id_to_descriptor . remove ( node_id) {
1032- peers. peers_needing_send . remove ( & descriptor) ;
10331034 if let Some ( mut peer) = peers. peers . remove ( & descriptor) {
10341035 if let Some ( ref msg) = * msg {
10351036 log_trace ! ( self , "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
@@ -1063,11 +1064,10 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
10631064 }
10641065 }
10651066
1066- for mut descriptor in peers. peers_needing_send . drain ( ) {
1067- match peers. peers . get_mut ( & descriptor) {
1068- Some ( peer) => self . do_attempt_write_data ( & mut descriptor, peer) ,
1069- None => panic ! ( "Inconsistent peers set state!" ) ,
1070- }
1067+ let peers_needing_send = peers. peers . iter_mut ( ) . filter ( |( _, peer) | peer. needing_send ) ;
1068+ for ( descriptor, peer) in peers_needing_send {
1069+ peer. needing_send = false ;
1070+ self . do_attempt_write_data ( & mut descriptor. clone ( ) , peer)
10711071 }
10721072 }
10731073 }
@@ -1084,9 +1084,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
10841084
10851085 fn disconnect_event_internal ( & self , descriptor : & Descriptor , no_connection_possible : bool ) {
10861086 let mut peers = self . peers . lock ( ) . unwrap ( ) ;
1087- peers. peers_needing_send . remove ( descriptor) ;
1088- let peer_option = peers. peers . remove ( descriptor) ;
1089- match peer_option {
1087+ match peers. peers . remove ( descriptor) {
10901088 None => panic ! ( "Descriptor for disconnect_event is not already known to PeerManager" ) ,
10911089 Some ( peer) => {
10921090 match peer. their_node_id {
@@ -1108,13 +1106,11 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
11081106 let mut peers_lock = self . peers . lock ( ) . unwrap ( ) ;
11091107 {
11101108 let peers = & mut * peers_lock;
1111- let peers_needing_send = & mut peers. peers_needing_send ;
11121109 let node_id_to_descriptor = & mut peers. node_id_to_descriptor ;
11131110 let peers = & mut peers. peers ;
11141111
11151112 peers. retain ( |descriptor, peer| {
11161113 if peer. awaiting_pong == true {
1117- peers_needing_send. remove ( descriptor) ;
11181114 match peer. their_node_id {
11191115 Some ( node_id) => {
11201116 node_id_to_descriptor. remove ( & node_id) ;
0 commit comments