@@ -20,7 +20,7 @@ use util::events::{MessageSendEvent, MessageSendEventsProvider};
20
20
use util:: logger:: Logger ;
21
21
use routing:: network_graph:: NetGraphMsgHandler ;
22
22
23
- use std:: collections:: { HashMap , hash_map, HashSet , LinkedList } ;
23
+ use std:: collections:: { HashMap , hash_map, HashSet } ;
24
24
use std:: sync:: { Arc , Mutex } ;
25
25
use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
26
26
use std:: { cmp, error, hash, fmt} ;
@@ -31,6 +31,9 @@ use bitcoin::hashes::sha256::HashEngine as Sha256Engine;
31
31
use bitcoin:: hashes:: { HashEngine , Hash } ;
32
32
use ln:: peers:: handshake:: PeerHandshake ;
33
33
use ln:: peers:: conduit:: Conduit ;
34
+ use ln:: peers:: outbound_buffer:: OutboundBuffer ;
35
+
36
+ const MSG_BUFF_SIZE : usize = 10 ;
34
37
35
38
/// Provides references to trait impls which handle different types of messages.
36
39
pub struct MessageHandler < CM : Deref , RM : Deref > where
@@ -111,6 +114,64 @@ enum InitSyncTracker{
111
114
NodesSyncing ( PublicKey ) ,
112
115
}
113
116
117
+ /// Trait representing a container that allows enqueuing of Vec<[u8]>
118
+ pub ( super ) trait Queueable {
119
+ /// Enqueue item to the queue
120
+ fn push_back ( & mut self , item : Vec < u8 > ) ;
121
+
122
+ /// Returns true if the queue is empty
123
+ fn is_empty ( & self ) -> bool ;
124
+
125
+ /// Returns the amount of available space in queue
126
+ fn queue_space ( & self ) -> usize ;
127
+ }
128
+
129
+ /// Implement &mut Queueable passthroughs
130
+ impl < ' a , T > Queueable for & ' a mut T where
131
+ T : Queueable {
132
+ fn push_back ( & mut self , item : Vec < u8 > ) {
133
+ T :: push_back ( self , item)
134
+ }
135
+
136
+ fn is_empty ( & self ) -> bool {
137
+ T :: is_empty ( self )
138
+ }
139
+
140
+ fn queue_space ( & self ) -> usize {
141
+ T :: queue_space ( self )
142
+ }
143
+ }
144
+
145
+ /// Trait representing a container that can try to flush data through a SocketDescriptor
146
+ pub ( super ) trait Flushable {
147
+ /// Write previously enqueued data to the SocketDescriptor. A return of false indicates the
148
+ /// underlying SocketDescriptor could not fulfill the send_data() call and the blocked state
149
+ /// has been set. Use unblock() when the SocketDescriptor may have more room.
150
+ fn try_flush_one ( & mut self , descriptor : & mut impl SocketDescriptor ) -> bool ;
151
+
152
+ /// Clear the blocked state caused when a previous write failed
153
+ fn unblock ( & mut self ) ;
154
+
155
+ /// Check if the container is in a blocked state
156
+ fn is_blocked ( & self ) -> bool ;
157
+ }
158
+
159
+ /// Implement &mut Flushable passthroughs
160
+ impl < ' a , T > Flushable for & ' a mut T where
161
+ T : Flushable {
162
+ fn try_flush_one ( & mut self , descriptor : & mut impl SocketDescriptor ) -> bool {
163
+ T :: try_flush_one ( self , descriptor)
164
+ }
165
+
166
+ fn unblock ( & mut self ) {
167
+ T :: unblock ( self )
168
+ }
169
+
170
+ fn is_blocked ( & self ) -> bool {
171
+ T :: is_blocked ( self )
172
+ }
173
+ }
174
+
114
175
enum PeerState {
115
176
Authenticating ( PeerHandshake ) ,
116
177
Connected ( Conduit ) ,
@@ -130,7 +191,7 @@ impl PeerState {
130
191
}
131
192
}
132
193
133
- fn process_peer_data ( & mut self , data : & [ u8 ] , mutable_response_buffer : & mut LinkedList < Vec < u8 > > ) -> PeerDataProcessingDecision {
194
+ fn process_peer_data ( & mut self , data : & [ u8 ] , pending_outbound_buffer : & mut impl Queueable ) -> PeerDataProcessingDecision {
134
195
let ( new_state_opt, decision) = match self {
135
196
& mut PeerState :: Authenticating ( ref mut handshake) => {
136
197
match handshake. process_act ( data) {
@@ -144,7 +205,7 @@ impl PeerState {
144
205
145
206
// Any response generated by the handshake sequence is put into the response buffer
146
207
if let Some ( response_vec) = response_vec_option {
147
- mutable_response_buffer . push_back ( response_vec) ;
208
+ pending_outbound_buffer . push_back ( response_vec) ;
148
209
}
149
210
150
211
// if process_act() returns the conduit and remote static public key (node id)
@@ -177,9 +238,7 @@ struct Peer {
177
238
their_node_id : Option < PublicKey > ,
178
239
their_features : Option < InitFeatures > ,
179
240
180
- pending_outbound_buffer : LinkedList < Vec < u8 > > ,
181
- pending_outbound_buffer_first_msg_offset : usize ,
182
- awaiting_write_event : bool ,
241
+ pending_outbound_buffer : OutboundBuffer ,
183
242
184
243
sync_status : InitSyncTracker ,
185
244
@@ -366,9 +425,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
366
425
their_node_id : Some ( their_node_id. clone ( ) ) ,
367
426
their_features : None ,
368
427
369
- pending_outbound_buffer : LinkedList :: new ( ) ,
370
- pending_outbound_buffer_first_msg_offset : 0 ,
371
- awaiting_write_event : false ,
428
+ pending_outbound_buffer : OutboundBuffer :: new ( MSG_BUFF_SIZE ) ,
372
429
373
430
sync_status : InitSyncTracker :: NoSyncRequested ,
374
431
@@ -398,9 +455,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
398
455
their_node_id : None ,
399
456
their_features : None ,
400
457
401
- pending_outbound_buffer : LinkedList :: new ( ) ,
402
- pending_outbound_buffer_first_msg_offset : 0 ,
403
- awaiting_write_event : false ,
458
+ pending_outbound_buffer : OutboundBuffer :: new ( MSG_BUFF_SIZE ) ,
404
459
405
460
sync_status : InitSyncTracker :: NoSyncRequested ,
406
461
@@ -423,13 +478,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
423
478
}
424
479
}
425
480
}
426
- const MSG_BUFF_SIZE : usize = 10 ;
427
- while !peer. awaiting_write_event {
428
- if peer. pending_outbound_buffer . len ( ) < MSG_BUFF_SIZE {
481
+
482
+ while !peer. pending_outbound_buffer . is_blocked ( ) {
483
+ let queue_space = peer. pending_outbound_buffer . queue_space ( ) ;
484
+ if queue_space > 0 {
429
485
match peer. sync_status {
430
486
InitSyncTracker :: NoSyncRequested => { } ,
431
487
InitSyncTracker :: ChannelsSyncing ( c) if c < 0xffff_ffff_ffff_ffff => {
432
- let steps = ( ( MSG_BUFF_SIZE - peer . pending_outbound_buffer . len ( ) + 2 ) / 3 ) as u8 ;
488
+ let steps = ( ( queue_space + 2 ) / 3 ) as u8 ;
433
489
let all_messages = self . message_handler . route_handler . get_next_channel_announcements ( c, steps) ;
434
490
for & ( ref announce, ref update_a_option, ref update_b_option) in all_messages. iter ( ) {
435
491
encode_and_send_msg ! ( announce) ;
@@ -446,7 +502,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
446
502
}
447
503
} ,
448
504
InitSyncTracker :: ChannelsSyncing ( c) if c == 0xffff_ffff_ffff_ffff => {
449
- let steps = ( MSG_BUFF_SIZE - peer . pending_outbound_buffer . len ( ) ) as u8 ;
505
+ let steps = queue_space as u8 ;
450
506
let all_messages = self . message_handler . route_handler . get_next_node_announcements ( None , steps) ;
451
507
for msg in all_messages. iter ( ) {
452
508
encode_and_send_msg ! ( msg) ;
@@ -458,7 +514,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
458
514
} ,
459
515
InitSyncTracker :: ChannelsSyncing ( _) => unreachable ! ( ) ,
460
516
InitSyncTracker :: NodesSyncing ( key) => {
461
- let steps = ( MSG_BUFF_SIZE - peer . pending_outbound_buffer . len ( ) ) as u8 ;
517
+ let steps = queue_space as u8 ;
462
518
let all_messages = self . message_handler . route_handler . get_next_node_announcements ( Some ( & key) , steps) ;
463
519
for msg in all_messages. iter ( ) {
464
520
encode_and_send_msg ! ( msg) ;
@@ -471,23 +527,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
471
527
}
472
528
}
473
529
474
- if {
475
- let next_buff = match peer. pending_outbound_buffer . front ( ) {
476
- None => return ,
477
- Some ( buff) => buff,
478
- } ;
479
-
480
- let should_be_reading = peer. pending_outbound_buffer . len ( ) < MSG_BUFF_SIZE ;
481
- let pending = & next_buff[ peer. pending_outbound_buffer_first_msg_offset ..] ;
482
- let data_sent = descriptor. send_data ( pending, should_be_reading) ;
483
- peer. pending_outbound_buffer_first_msg_offset += data_sent;
484
- if peer. pending_outbound_buffer_first_msg_offset == next_buff. len ( ) { true } else { false }
485
- } {
486
- peer. pending_outbound_buffer_first_msg_offset = 0 ;
487
- peer. pending_outbound_buffer . pop_front ( ) ;
488
- } else {
489
- peer. awaiting_write_event = true ;
530
+ // No messages to send
531
+ if peer. pending_outbound_buffer . is_empty ( ) {
532
+ break ;
490
533
}
534
+
535
+ peer. pending_outbound_buffer . try_flush_one ( descriptor) ;
491
536
}
492
537
}
493
538
@@ -506,7 +551,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
506
551
match peers. peers . get_mut ( descriptor) {
507
552
None => panic ! ( "Descriptor for write_event is not already known to PeerManager" ) ,
508
553
Some ( peer) => {
509
- peer. awaiting_write_event = false ;
554
+ peer. pending_outbound_buffer . unblock ( ) ;
510
555
self . do_attempt_write_data ( descriptor, peer) ;
511
556
}
512
557
} ;
@@ -684,7 +729,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
684
729
685
730
self . do_attempt_write_data ( peer_descriptor, peer) ;
686
731
687
- peer. pending_outbound_buffer . len ( ) > 10 // pause_read
732
+ peer. pending_outbound_buffer . queue_space ( ) == 0 // pause_read
688
733
}
689
734
} ;
690
735
0 commit comments