@@ -10,14 +10,17 @@ use futures_util::{SinkExt, Stream, StreamExt};
10
10
use iroh_base:: NodeId ;
11
11
use iroh_metrics:: { inc, inc_by} ;
12
12
use rand:: Rng ;
13
- use tokio:: sync:: mpsc:: { self , error:: TrySendError } ;
13
+ use tokio:: {
14
+ sync:: mpsc:: { self , error:: TrySendError } ,
15
+ time:: MissedTickBehavior ,
16
+ } ;
14
17
use tokio_util:: { sync:: CancellationToken , task:: AbortOnDropHandle } ;
15
18
use tracing:: { debug, error, instrument, trace, warn, Instrument } ;
16
19
17
20
use crate :: {
18
21
protos:: {
19
22
disco,
20
- relay:: { write_frame, Frame , KEEP_ALIVE } ,
23
+ relay:: { write_frame, Frame , PING_INTERVAL , PING_TIMEOUT } ,
21
24
} ,
22
25
server:: { clients:: Clients , metrics:: Metrics , streams:: RelayedStream , ClientRateLimit } ,
23
26
PingTracker ,
@@ -104,7 +107,7 @@ impl Client {
104
107
node_id,
105
108
connection_id,
106
109
clients : clients. clone ( ) ,
107
- ping_tracker : PingTracker :: new ( Duration :: from_secs ( 5 ) ) ,
110
+ ping_tracker : PingTracker :: new ( PING_TIMEOUT ) ,
108
111
} ;
109
112
110
113
// start io loop
@@ -227,12 +230,13 @@ impl Actor {
227
230
// Add some jitter to ping pong interactions, to avoid all pings being sent at the same time
228
231
let next_interval = || {
229
232
let random_secs = rand:: rngs:: OsRng . gen_range ( 1 ..=5 ) ;
230
- Duration :: from_secs ( random_secs) + KEEP_ALIVE
233
+ Duration :: from_secs ( random_secs) + PING_INTERVAL
231
234
} ;
232
235
233
- let mut keep_alive = tokio:: time:: interval ( next_interval ( ) ) ;
236
+ let mut ping_interval = tokio:: time:: interval ( next_interval ( ) ) ;
234
237
// ticks immediately
235
- keep_alive. tick ( ) . await ;
238
+ ping_interval. set_missed_tick_behavior ( MissedTickBehavior :: Delay ) ;
239
+ ping_interval. tick ( ) . await ;
236
240
237
241
loop {
238
242
tokio:: select! {
@@ -267,10 +271,10 @@ impl Actor {
267
271
trace!( "pong timed out" ) ;
268
272
break ;
269
273
}
270
- _ = keep_alive . tick( ) => {
274
+ _ = ping_interval . tick( ) => {
271
275
trace!( "keep alive ping" ) ;
272
276
// new interval
273
- keep_alive . reset_after( next_interval( ) ) ;
277
+ ping_interval . reset_after( next_interval( ) ) ;
274
278
let data = self . ping_tracker. new_ping( ) ;
275
279
self . write_frame( Frame :: Ping { data } ) . await ?;
276
280
}
0 commit comments