@@ -3,14 +3,14 @@ use std::{
3
3
net:: IpAddr ,
4
4
path:: { Component , Path } ,
5
5
sync:: Arc ,
6
- time:: { Instant , SystemTime } ,
6
+ time:: { Duration , Instant , SystemTime } ,
7
7
} ;
8
8
9
9
use drop_analytics:: { InitEventData , Moose , TransferStateEventData } ;
10
10
use drop_config:: DropConfig ;
11
11
use drop_core:: Status ;
12
12
use drop_storage:: Storage ;
13
- use slog:: { debug, trace, Logger } ;
13
+ use slog:: { debug, info , trace, Logger } ;
14
14
use tokio:: sync:: { mpsc, Semaphore } ;
15
15
use tokio_util:: sync:: CancellationToken ;
16
16
use uuid:: Uuid ;
@@ -19,7 +19,7 @@ use crate::{
19
19
auth,
20
20
error:: ResultExt ,
21
21
manager:: { self } ,
22
- tasks:: AliveWaiter ,
22
+ tasks:: { AliveGuard , AliveWaiter } ,
23
23
transfer:: Transfer ,
24
24
ws:: { self , EventTxFactory } ,
25
25
Error , Event , FileId , TransferManager ,
@@ -106,12 +106,22 @@ impl Service {
106
106
107
107
manager:: resume ( & refresh_trigger. subscribe ( ) , & state, & logger, & guard, & stop) . await ;
108
108
109
+ if let Some ( interval) = state. config . auto_retry_interval {
110
+ spawn_auto_retry_loop (
111
+ refresh_trigger. clone ( ) ,
112
+ interval,
113
+ logger. clone ( ) ,
114
+ guard. clone ( ) ,
115
+ stop. clone ( ) ,
116
+ ) ;
117
+ }
118
+
109
119
Ok ( Self {
110
120
refresh_trigger,
111
121
state,
112
122
stop,
113
123
waiter,
114
- logger : logger . clone ( ) ,
124
+ logger,
115
125
} )
116
126
} ;
117
127
@@ -335,3 +345,37 @@ fn validate_dest_path(parent_dir: &Path) -> crate::Result<()> {
335
345
336
346
Ok ( ( ) )
337
347
}
348
+
349
+ fn spawn_auto_retry_loop (
350
+ trigger : tokio:: sync:: watch:: Sender < ( ) > ,
351
+ interval : Duration ,
352
+ logger : Logger ,
353
+ guard : AliveGuard ,
354
+ stop : CancellationToken ,
355
+ ) {
356
+ info ! (
357
+ logger,
358
+ "Starting auto retry loop with interval: {}ms" ,
359
+ interval. as_millis( )
360
+ ) ;
361
+
362
+ tokio:: spawn ( async move {
363
+ let _guard = guard;
364
+
365
+ let task = async {
366
+ loop {
367
+ tokio:: time:: sleep ( interval) . await ;
368
+ let _ = trigger. send ( ( ) ) ;
369
+ }
370
+ } ;
371
+
372
+ tokio:: select! {
373
+ biased;
374
+
375
+ _ = stop. cancelled( ) => {
376
+ debug!( logger, "Stopping auto retry loop" ) ;
377
+ } ,
378
+ _ = task => ( ) ,
379
+ }
380
+ } ) ;
381
+ }
0 commit comments