@@ -16,7 +16,7 @@ use util::byte_utils;
1616use util:: events:: { MessageSendEvent } ;
1717use util:: logger:: Logger ;
1818
19- use std:: collections:: { HashMap , hash_map, HashSet , LinkedList } ;
19+ use std:: collections:: { HashMap , hash_map, LinkedList } ;
2020use std:: sync:: { Arc , Mutex } ;
2121use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
2222use std:: { cmp, error, hash, fmt} ;
@@ -117,6 +117,10 @@ struct Peer {
117117 sync_status : InitSyncTracker ,
118118
119119 awaiting_pong : bool ,
120+
121+ /// Indicates do_read_event() pushed a message into pending_outbound_buffer but didn't call
122+ /// do_attempt_write_data() to avoid reentrancy. Cleared in process_events().
123+ needing_send : bool ,
120124}
121125
122126impl Peer {
@@ -137,9 +141,6 @@ impl Peer {
137141
138142struct PeerHolder < Descriptor : SocketDescriptor > {
139143 peers : HashMap < Descriptor , Peer > ,
140- /// Added to by do_read_event for cases where we pushed a message onto the send buffer but
141- /// didn't call do_attempt_write_data to avoid reentrancy. Cleared in process_events()
142- peers_needing_send : HashSet < Descriptor > ,
143144 /// Only add to this set when noise completes:
144145 node_id_to_descriptor : HashMap < PublicKey , Descriptor > ,
145146}
@@ -204,7 +205,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
204205 message_handler : message_handler,
205206 peers : Mutex :: new ( PeerHolder {
206207 peers : HashMap :: new ( ) ,
207- peers_needing_send : HashSet :: new ( ) ,
208208 node_id_to_descriptor : HashMap :: new ( )
209209 } ) ,
210210 our_node_secret : our_node_secret,
@@ -275,6 +275,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
275275 sync_status : InitSyncTracker :: NoSyncRequested ,
276276
277277 awaiting_pong : false ,
278+ needing_send : false ,
278279 } ) . is_some ( ) {
279280 panic ! ( "PeerManager driver duplicated descriptors!" ) ;
280281 } ;
@@ -312,6 +313,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
312313 sync_status : InitSyncTracker :: NoSyncRequested ,
313314
314315 awaiting_pong : false ,
316+ needing_send : false ,
315317 } ) . is_some ( ) {
316318 panic ! ( "PeerManager driver duplicated descriptors!" ) ;
317319 } ;
@@ -461,7 +463,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
461463 {
462464 log_trace!( self , "Encoding and sending message of type {} to {}" , $msg_code, log_pubkey!( peer. their_node_id. unwrap( ) ) ) ;
463465 peer. pending_outbound_buffer. push_back( peer. channel_encryptor. encrypt_message( & encode_msg!( $msg, $msg_code) [ ..] ) ) ;
464- peers . peers_needing_send . insert ( peer_descriptor . clone ( ) ) ;
466+ peer . needing_send = true ;
465467 }
466468 }
467469 }
@@ -620,7 +622,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
620622
621623 if msg. features . initial_routing_sync ( ) {
622624 peer. sync_status = InitSyncTracker :: ChannelsSyncing ( 0 ) ;
623- peers . peers_needing_send . insert ( peer_descriptor . clone ( ) ) ;
625+ peer . needing_send = true ;
624626 }
625627 peer. their_features = Some ( msg. features ) ;
626628
@@ -1005,7 +1007,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10051007 match * action {
10061008 msgs:: ErrorAction :: DisconnectPeer { ref msg } => {
10071009 if let Some ( mut descriptor) = peers. node_id_to_descriptor . remove ( node_id) {
1008- peers. peers_needing_send . remove ( & descriptor) ;
10091010 if let Some ( mut peer) = peers. peers . remove ( & descriptor) {
10101011 if let Some ( ref msg) = * msg {
10111012 log_trace ! ( self , "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
@@ -1039,11 +1040,10 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10391040 }
10401041 }
10411042
1042- for mut descriptor in peers. peers_needing_send . drain ( ) {
1043- match peers. peers . get_mut ( & descriptor) {
1044- Some ( peer) => self . do_attempt_write_data ( & mut descriptor, peer) ,
1045- None => panic ! ( "Inconsistent peers set state!" ) ,
1046- }
1043+ let peers_needing_send = peers. peers . iter_mut ( ) . filter ( |( _, peer) | peer. needing_send ) ;
1044+ for ( descriptor, peer) in peers_needing_send {
1045+ peer. needing_send = false ;
1046+ self . do_attempt_write_data ( & mut descriptor. clone ( ) , peer)
10471047 }
10481048 }
10491049 }
@@ -1060,9 +1060,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10601060
10611061 fn disconnect_event_internal ( & self , descriptor : & Descriptor , no_connection_possible : bool ) {
10621062 let mut peers = self . peers . lock ( ) . unwrap ( ) ;
1063- peers. peers_needing_send . remove ( descriptor) ;
1064- let peer_option = peers. peers . remove ( descriptor) ;
1065- match peer_option {
1063+ match peers. peers . remove ( descriptor) {
10661064 None => panic ! ( "Descriptor for disconnect_event is not already known to PeerManager" ) ,
10671065 Some ( peer) => {
10681066 match peer. their_node_id {
@@ -1084,13 +1082,11 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10841082 let mut peers_lock = self . peers . lock ( ) . unwrap ( ) ;
10851083 {
10861084 let peers = & mut * peers_lock;
1087- let peers_needing_send = & mut peers. peers_needing_send ;
10881085 let node_id_to_descriptor = & mut peers. node_id_to_descriptor ;
10891086 let peers = & mut peers. peers ;
10901087
10911088 peers. retain ( |descriptor, peer| {
10921089 if peer. awaiting_pong == true {
1093- peers_needing_send. remove ( descriptor) ;
10941090 match peer. their_node_id {
10951091 Some ( node_id) => {
10961092 node_id_to_descriptor. remove ( & node_id) ;
0 commit comments