@@ -342,6 +342,18 @@ const OUTBOUND_BUFFER_LIMIT_READ_PAUSE: usize = 10;
342
342
/// the peer.
343
343
const OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP : usize = 20 ;
344
344
345
+ /// If we've sent a ping, and are still awaiting a response, we may need to churn our way through
346
+ /// the socket receive buffer before we get it.
347
+ ///
348
+ /// On a fairly old Arm64 board, with Linux defaults, this can take as long as 20 seconds, not
349
+ /// including any network delays or outbound traffic.
350
+ ///
351
+ /// Thus, to avoid needlessly disconnecting a peer, we allow a peer to take this many timer ticks
352
+ /// to respond to a ping, as long as they send us at least one message during each tick, ensuring
353
+ /// we aren't actually just disconnected. With a timer tick interval of five seconds, this
354
+ /// translates to about 30 seconds.
355
+ const MAX_BUFFER_DRAIN_TICK_INTERVALS : u8 = 6 ;
356
+
345
357
struct Peer {
346
358
channel_encryptor : PeerChannelEncryptor ,
347
359
their_node_id : Option < PublicKey > ,
@@ -357,7 +369,8 @@ struct Peer {
357
369
358
370
sync_status : InitSyncTracker ,
359
371
360
- awaiting_pong : bool ,
372
+ awaiting_pong_tick_intervals : u8 ,
373
+ received_message_since_timer_tick : bool ,
361
374
}
362
375
363
376
impl Peer {
@@ -617,7 +630,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
617
630
618
631
sync_status : InitSyncTracker :: NoSyncRequested ,
619
632
620
- awaiting_pong : false ,
633
+ awaiting_pong_tick_intervals : 0 ,
634
+ received_message_since_timer_tick : false ,
621
635
} ) ) . is_some ( ) {
622
636
panic ! ( "PeerManager driver duplicated descriptors!" ) ;
623
637
} ;
@@ -655,7 +669,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
655
669
656
670
sync_status : InitSyncTracker :: NoSyncRequested ,
657
671
658
- awaiting_pong : false ,
672
+ awaiting_pong_tick_intervals : 0 ,
673
+ received_message_since_timer_tick : false ,
659
674
} ) ) . is_some ( ) {
660
675
panic ! ( "PeerManager driver duplicated descriptors!" ) ;
661
676
} ;
@@ -996,6 +1011,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
996
1011
) -> Result < Option < wire:: Message < <<CMH as core:: ops:: Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > > , MessageHandlingError > {
997
1012
998
1013
let their_node_id = peer_lock. their_node_id . clone ( ) . expect ( "We know the peer's public key by the time we recieve messages" ) ;
1014
+ peer_lock. received_message_since_timer_tick = true ;
999
1015
1000
1016
// Need an Init as first message
1001
1017
if let wire:: Message :: Init ( msg) = message {
@@ -1067,7 +1083,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
1067
1083
}
1068
1084
} ,
1069
1085
wire:: Message :: Pong ( _msg) => {
1070
- peer_mutex. lock ( ) . unwrap ( ) . awaiting_pong = false ;
1086
+ peer_mutex. lock ( ) . unwrap ( ) . awaiting_pong_tick_intervals = 0 ;
1071
1087
} ,
1072
1088
1073
1089
// Channel messages:
@@ -1581,25 +1597,31 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
1581
1597
1582
1598
for ( descriptor, peer_mutex) in peers_lock. peers . iter ( ) {
1583
1599
let mut peer = peer_mutex. lock ( ) . unwrap ( ) ;
1584
- if peer. awaiting_pong {
1600
+ if !peer. channel_encryptor . is_ready_for_encryption ( ) {
1601
+ // The peer needs to complete its handshake before we can exchange messages
1602
+ continue ;
1603
+ }
1604
+
1605
+ if ( peer. awaiting_pong_tick_intervals > 0 && !peer. received_message_since_timer_tick )
1606
+ || peer. awaiting_pong_tick_intervals > MAX_BUFFER_DRAIN_TICK_INTERVALS
1607
+ {
1585
1608
descriptors_needing_disconnect. push ( descriptor. clone ( ) ) ;
1586
1609
continue ;
1587
1610
}
1588
1611
1589
- if !peer. channel_encryptor . is_ready_for_encryption ( ) {
1590
- // The peer needs to complete its handshake before we can exchange messages
1612
+ peer. received_message_since_timer_tick = false ;
1613
+ if peer. awaiting_pong_tick_intervals > 0 {
1614
+ peer. awaiting_pong_tick_intervals += 1 ;
1591
1615
continue ;
1592
1616
}
1617
+ peer. awaiting_pong_tick_intervals = 0 ;
1593
1618
1594
1619
let ping = msgs:: Ping {
1595
1620
ponglen : 0 ,
1596
1621
byteslen : 64 ,
1597
1622
} ;
1598
1623
self . enqueue_message ( & mut * peer, & ping) ;
1599
-
1600
1624
self . do_attempt_write_data ( & mut ( descriptor. clone ( ) ) , & mut * peer) ;
1601
-
1602
- peer. awaiting_pong = true ;
1603
1625
}
1604
1626
}
1605
1627
0 commit comments