@@ -40,7 +40,7 @@ use crate::util::string::PrintableString;
40
40
41
41
use crate :: prelude:: * ;
42
42
use crate :: io;
43
- use alloc:: collections:: LinkedList ;
43
+ use alloc:: collections:: VecDeque ;
44
44
use crate :: sync:: { Arc , Mutex , MutexGuard , FairRwLock } ;
45
45
use core:: sync:: atomic:: { AtomicBool , AtomicU32 , AtomicI32 , Ordering } ;
46
46
use core:: { cmp, hash, fmt, mem} ;
@@ -489,13 +489,13 @@ struct Peer {
489
489
their_features : Option < InitFeatures > ,
490
490
their_socket_address : Option < SocketAddress > ,
491
491
492
- pending_outbound_buffer : LinkedList < Vec < u8 > > ,
492
+ pending_outbound_buffer : VecDeque < Vec < u8 > > ,
493
493
pending_outbound_buffer_first_msg_offset : usize ,
494
494
/// Queue gossip broadcasts separately from `pending_outbound_buffer` so we can easily
495
495
/// prioritize channel messages over them.
496
496
///
497
497
/// Note that these messages are *not* encrypted/MAC'd, and are only serialized.
498
- gossip_broadcast_buffer : LinkedList < Vec < u8 > > ,
498
+ gossip_broadcast_buffer : VecDeque < Vec < u8 > > ,
499
499
awaiting_write_event : bool ,
500
500
501
501
pending_read_buffer : Vec < u8 > ,
@@ -997,9 +997,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
997
997
their_features : None ,
998
998
their_socket_address : remote_network_address,
999
999
1000
- pending_outbound_buffer : LinkedList :: new ( ) ,
1000
+ pending_outbound_buffer : VecDeque :: new ( ) ,
1001
1001
pending_outbound_buffer_first_msg_offset : 0 ,
1002
- gossip_broadcast_buffer : LinkedList :: new ( ) ,
1002
+ gossip_broadcast_buffer : VecDeque :: new ( ) ,
1003
1003
awaiting_write_event : false ,
1004
1004
1005
1005
pending_read_buffer,
@@ -1053,9 +1053,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1053
1053
their_features : None ,
1054
1054
their_socket_address : remote_network_address,
1055
1055
1056
- pending_outbound_buffer : LinkedList :: new ( ) ,
1056
+ pending_outbound_buffer : VecDeque :: new ( ) ,
1057
1057
pending_outbound_buffer_first_msg_offset : 0 ,
1058
- gossip_broadcast_buffer : LinkedList :: new ( ) ,
1058
+ gossip_broadcast_buffer : VecDeque :: new ( ) ,
1059
1059
awaiting_write_event : false ,
1060
1060
1061
1061
pending_read_buffer,
@@ -1168,6 +1168,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1168
1168
if peer. pending_outbound_buffer_first_msg_offset == next_buff. len ( ) {
1169
1169
peer. pending_outbound_buffer_first_msg_offset = 0 ;
1170
1170
peer. pending_outbound_buffer . pop_front ( ) ;
1171
+ // Try to keep the buffer to no more than 170 elements
1172
+ const VEC_SIZE : usize = :: core:: mem:: size_of :: < Vec < u8 > > ( ) ;
1173
+ let large_capacity = peer. pending_outbound_buffer . capacity ( ) > 4096 / VEC_SIZE ;
1174
+ let lots_of_slack = peer. pending_outbound_buffer . len ( )
1175
+ < peer. pending_outbound_buffer . capacity ( ) / 2 ;
1176
+ if large_capacity && lots_of_slack {
1177
+ peer. pending_outbound_buffer . shrink_to_fit ( ) ;
1178
+ }
1171
1179
} else {
1172
1180
peer. awaiting_write_event = true ;
1173
1181
}
@@ -1246,6 +1254,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1246
1254
/// Append a message to a peer's pending outbound/write gossip broadcast buffer
1247
1255
fn enqueue_encoded_gossip_broadcast ( & self , peer : & mut Peer , encoded_message : Vec < u8 > ) {
1248
1256
peer. msgs_sent_since_pong += 1 ;
1257
+ debug_assert ! ( peer. gossip_broadcast_buffer. len( ) <= OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP ) ;
1249
1258
peer. gossip_broadcast_buffer . push_back ( encoded_message) ;
1250
1259
}
1251
1260
0 commit comments