@@ -11,6 +11,8 @@ use log::{debug, info};
11
11
12
12
use git2:: Oid ;
13
13
use std:: sync:: Arc ;
14
+ use std:: thread;
15
+ use std:: time:: Duration ;
14
16
15
17
#[ derive( Debug , Clone , Eq , PartialEq , serde:: Serialize ) ]
16
18
pub ( crate ) struct QueuedCrate {
@@ -220,20 +222,22 @@ impl BuildQueue {
220
222
}
221
223
}
222
224
223
- fn retry < T > ( mut f : impl FnMut ( ) -> Result < T > ) -> Result < T > {
224
- const MAX_ATTEMPTS : u8 = 3 ;
225
+ fn retry < T > ( mut f : impl FnMut ( ) -> Result < T > , max_attempts : u32 ) -> Result < T > {
225
226
for attempt in 1 .. {
226
227
match f ( ) {
227
228
Ok ( result) => return Ok ( result) ,
228
229
Err ( err) => {
229
- if attempt > MAX_ATTEMPTS {
230
+ if attempt > max_attempts {
230
231
return Err ( err) ;
231
232
} else {
233
+ let sleep_for = 2u32 . pow ( attempt) ;
232
234
log:: warn!(
233
- "got error on attempt {}, will try again:\n {:?}" ,
235
+ "got error on attempt {}, will try again after {}s :\n {:?}" ,
234
236
attempt,
237
+ sleep_for,
235
238
err
236
239
) ;
240
+ thread:: sleep ( Duration :: from_secs ( sleep_for as u64 ) ) ;
237
241
}
238
242
}
239
243
}
@@ -345,23 +349,29 @@ impl BuildQueue {
345
349
. map ( |r| PackageKind :: Registry ( r. as_str ( ) ) )
346
350
. unwrap_or ( PackageKind :: CratesIo ) ;
347
351
348
- match retry ( || {
349
- builder
350
- . update_toolchain ( )
351
- . context ( "Updating toolchain failed, locking queue" )
352
- } ) {
352
+ match retry (
353
+ || {
354
+ builder
355
+ . update_toolchain ( )
356
+ . context ( "Updating toolchain failed, locking queue" )
357
+ } ,
358
+ 3 ,
359
+ ) {
353
360
Err ( err) => {
354
361
report_error ( & err) ;
355
362
self . lock ( ) ?;
356
363
return Err ( err) ;
357
364
}
358
365
Ok ( true ) => {
359
366
// toolchain has changed, purge caches
360
- if let Err ( err) = retry ( || {
361
- builder
362
- . purge_caches ( )
363
- . context ( "purging rustwide caches failed, locking queue" )
364
- } ) {
367
+ if let Err ( err) = retry (
368
+ || {
369
+ builder
370
+ . purge_caches ( )
371
+ . context ( "purging rustwide caches failed, locking queue" )
372
+ } ,
373
+ 3 ,
374
+ ) {
365
375
report_error ( & err) ;
366
376
self . lock ( ) ?;
367
377
return Err ( err) ;
0 commit comments