@@ -29,7 +29,7 @@ use util::events::{MessageSendEvent, MessageSendEventsProvider};
29
29
use util:: logger:: Logger ;
30
30
use routing:: network_graph:: NetGraphMsgHandler ;
31
31
32
- use std:: collections:: { HashMap , hash_map, HashSet , LinkedList } ;
32
+ use std:: collections:: { HashMap , hash_map, HashSet } ;
33
33
use std:: sync:: { Arc , Mutex } ;
34
34
use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
35
35
use std:: { cmp, error, hash, fmt} ;
@@ -40,6 +40,9 @@ use bitcoin::hashes::sha256::HashEngine as Sha256Engine;
40
40
use bitcoin:: hashes:: { HashEngine , Hash } ;
41
41
use ln:: peers:: handshake:: PeerHandshake ;
42
42
use ln:: peers:: conduit:: Conduit ;
43
+ use ln:: peers:: outbound_queue:: OutboundQueue ;
44
+
45
+ const MSG_BUFF_SIZE : usize = 10 ;
43
46
44
47
/// Provides references to trait impls which handle different types of messages.
45
48
pub struct MessageHandler < CM : Deref , RM : Deref > where
@@ -120,6 +123,64 @@ enum InitSyncTracker{
120
123
NodesSyncing ( PublicKey ) ,
121
124
}
122
125
126
+ /// Trait representing a container that allows enqueuing of Vec<[u8]>
127
+ pub ( super ) trait PayloadQueuer {
128
+ /// Enqueue item to the queue
129
+ fn push_back ( & mut self , item : Vec < u8 > ) ;
130
+
131
+ /// Returns true if the queue is empty
132
+ fn is_empty ( & self ) -> bool ;
133
+
134
+ /// Returns the amount of available space in queue
135
+ fn queue_space ( & self ) -> usize ;
136
+ }
137
+
138
+ /// Implement &mut PayloadQueuer passthroughs
139
+ impl < ' a , T > PayloadQueuer for & ' a mut T where
140
+ T : PayloadQueuer {
141
+ fn push_back ( & mut self , item : Vec < u8 > ) {
142
+ T :: push_back ( self , item)
143
+ }
144
+
145
+ fn is_empty ( & self ) -> bool {
146
+ T :: is_empty ( self )
147
+ }
148
+
149
+ fn queue_space ( & self ) -> usize {
150
+ T :: queue_space ( self )
151
+ }
152
+ }
153
+
154
+ /// Trait representing a container that can try to flush data through a SocketDescriptor
155
+ pub ( super ) trait SocketDescriptorFlusher {
156
+ /// Write previously enqueued data to the SocketDescriptor. A return of false indicates the
157
+ /// underlying SocketDescriptor could not fulfill the send_data() call and the blocked state
158
+ /// has been set. Use unblock() when the SocketDescriptor may have more room.
159
+ fn try_flush_one ( & mut self , descriptor : & mut impl SocketDescriptor ) -> bool ;
160
+
161
+ /// Clear the blocked state caused when a previous write failed
162
+ fn unblock ( & mut self ) ;
163
+
164
+ /// Check if the container is in a blocked state
165
+ fn is_blocked ( & self ) -> bool ;
166
+ }
167
+
168
+ /// Implement &mut Flushable passthroughs
169
+ impl < ' a , T > SocketDescriptorFlusher for & ' a mut T where
170
+ T : SocketDescriptorFlusher {
171
+ fn try_flush_one ( & mut self , descriptor : & mut impl SocketDescriptor ) -> bool {
172
+ T :: try_flush_one ( self , descriptor)
173
+ }
174
+
175
+ fn unblock ( & mut self ) {
176
+ T :: unblock ( self )
177
+ }
178
+
179
+ fn is_blocked ( & self ) -> bool {
180
+ T :: is_blocked ( self )
181
+ }
182
+ }
183
+
123
184
enum PeerState {
124
185
Authenticating ( PeerHandshake ) ,
125
186
Connected ( Conduit ) ,
@@ -139,7 +200,7 @@ impl PeerState {
139
200
}
140
201
}
141
202
142
- fn process_peer_data ( & mut self , data : & [ u8 ] , mutable_response_buffer : & mut LinkedList < Vec < u8 > > ) -> PeerDataProcessingDecision {
203
+ fn process_peer_data ( & mut self , data : & [ u8 ] , pending_outbound_buffer : & mut impl PayloadQueuer ) -> PeerDataProcessingDecision {
143
204
let ( new_state_opt, decision) = match self {
144
205
& mut PeerState :: Authenticating ( ref mut handshake) => {
145
206
match handshake. process_act ( data) {
@@ -153,7 +214,7 @@ impl PeerState {
153
214
154
215
// Any response generated by the handshake sequence is put into the response buffer
155
216
if let Some ( response_vec) = response_vec_option {
156
- mutable_response_buffer . push_back ( response_vec) ;
217
+ pending_outbound_buffer . push_back ( response_vec) ;
157
218
}
158
219
159
220
// if process_act() returns the conduit and remote static public key (node id)
@@ -186,9 +247,7 @@ struct Peer {
186
247
their_node_id : Option < PublicKey > ,
187
248
their_features : Option < InitFeatures > ,
188
249
189
- pending_outbound_buffer : LinkedList < Vec < u8 > > ,
190
- pending_outbound_buffer_first_msg_offset : usize ,
191
- awaiting_write_event : bool ,
250
+ pending_outbound_buffer : OutboundQueue ,
192
251
193
252
sync_status : InitSyncTracker ,
194
253
@@ -375,9 +434,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
375
434
their_node_id : Some ( their_node_id. clone ( ) ) ,
376
435
their_features : None ,
377
436
378
- pending_outbound_buffer : LinkedList :: new ( ) ,
379
- pending_outbound_buffer_first_msg_offset : 0 ,
380
- awaiting_write_event : false ,
437
+ pending_outbound_buffer : OutboundQueue :: new ( MSG_BUFF_SIZE ) ,
381
438
382
439
sync_status : InitSyncTracker :: NoSyncRequested ,
383
440
@@ -407,9 +464,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
407
464
their_node_id : None ,
408
465
their_features : None ,
409
466
410
- pending_outbound_buffer : LinkedList :: new ( ) ,
411
- pending_outbound_buffer_first_msg_offset : 0 ,
412
- awaiting_write_event : false ,
467
+ pending_outbound_buffer : OutboundQueue :: new ( MSG_BUFF_SIZE ) ,
413
468
414
469
sync_status : InitSyncTracker :: NoSyncRequested ,
415
470
@@ -432,13 +487,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
432
487
}
433
488
}
434
489
}
435
- const MSG_BUFF_SIZE : usize = 10 ;
436
- while !peer. awaiting_write_event {
437
- if peer. pending_outbound_buffer . len ( ) < MSG_BUFF_SIZE {
490
+
491
+ while !peer. pending_outbound_buffer . is_blocked ( ) {
492
+ let queue_space = peer. pending_outbound_buffer . queue_space ( ) ;
493
+ if queue_space > 0 {
438
494
match peer. sync_status {
439
495
InitSyncTracker :: NoSyncRequested => { } ,
440
496
InitSyncTracker :: ChannelsSyncing ( c) if c < 0xffff_ffff_ffff_ffff => {
441
- let steps = ( ( MSG_BUFF_SIZE - peer . pending_outbound_buffer . len ( ) + 2 ) / 3 ) as u8 ;
497
+ let steps = ( ( queue_space + 2 ) / 3 ) as u8 ;
442
498
let all_messages = self . message_handler . route_handler . get_next_channel_announcements ( c, steps) ;
443
499
for & ( ref announce, ref update_a_option, ref update_b_option) in all_messages. iter ( ) {
444
500
encode_and_send_msg ! ( announce) ;
@@ -455,7 +511,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
455
511
}
456
512
} ,
457
513
InitSyncTracker :: ChannelsSyncing ( c) if c == 0xffff_ffff_ffff_ffff => {
458
- let steps = ( MSG_BUFF_SIZE - peer . pending_outbound_buffer . len ( ) ) as u8 ;
514
+ let steps = queue_space as u8 ;
459
515
let all_messages = self . message_handler . route_handler . get_next_node_announcements ( None , steps) ;
460
516
for msg in all_messages. iter ( ) {
461
517
encode_and_send_msg ! ( msg) ;
@@ -467,7 +523,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
467
523
} ,
468
524
InitSyncTracker :: ChannelsSyncing ( _) => unreachable ! ( ) ,
469
525
InitSyncTracker :: NodesSyncing ( key) => {
470
- let steps = ( MSG_BUFF_SIZE - peer . pending_outbound_buffer . len ( ) ) as u8 ;
526
+ let steps = queue_space as u8 ;
471
527
let all_messages = self . message_handler . route_handler . get_next_node_announcements ( Some ( & key) , steps) ;
472
528
for msg in all_messages. iter ( ) {
473
529
encode_and_send_msg ! ( msg) ;
@@ -480,23 +536,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
480
536
}
481
537
}
482
538
483
- if {
484
- let next_buff = match peer. pending_outbound_buffer . front ( ) {
485
- None => return ,
486
- Some ( buff) => buff,
487
- } ;
488
-
489
- let should_be_reading = peer. pending_outbound_buffer . len ( ) < MSG_BUFF_SIZE ;
490
- let pending = & next_buff[ peer. pending_outbound_buffer_first_msg_offset ..] ;
491
- let data_sent = descriptor. send_data ( pending, should_be_reading) ;
492
- peer. pending_outbound_buffer_first_msg_offset += data_sent;
493
- if peer. pending_outbound_buffer_first_msg_offset == next_buff. len ( ) { true } else { false }
494
- } {
495
- peer. pending_outbound_buffer_first_msg_offset = 0 ;
496
- peer. pending_outbound_buffer . pop_front ( ) ;
497
- } else {
498
- peer. awaiting_write_event = true ;
539
+ // No messages to send
540
+ if peer. pending_outbound_buffer . is_empty ( ) {
541
+ break ;
499
542
}
543
+
544
+ peer. pending_outbound_buffer . try_flush_one ( descriptor) ;
500
545
}
501
546
}
502
547
@@ -515,7 +560,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
515
560
match peers. peers . get_mut ( descriptor) {
516
561
None => panic ! ( "Descriptor for write_event is not already known to PeerManager" ) ,
517
562
Some ( peer) => {
518
- peer. awaiting_write_event = false ;
563
+ peer. pending_outbound_buffer . unblock ( ) ;
519
564
self . do_attempt_write_data ( descriptor, peer) ;
520
565
}
521
566
} ;
@@ -693,7 +738,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
693
738
694
739
self . do_attempt_write_data ( peer_descriptor, peer) ;
695
740
696
- peer. pending_outbound_buffer . len ( ) > 10 // pause_read
741
+ peer. pending_outbound_buffer . queue_space ( ) == 0 // pause_read
697
742
}
698
743
} ;
699
744
0 commit comments