File tree Expand file tree Collapse file tree 1 file changed +27
-8
lines changed Expand file tree Collapse file tree 1 file changed +27
-8
lines changed Original file line number Diff line number Diff line change @@ -220,6 +220,23 @@ impl BuildQueue {
220
220
}
221
221
}
222
222
223
+ fn retry < T > ( mut f : impl FnMut ( ) -> Result < T > ) -> Result < T > {
224
+ const MAX_ATTEMPTS : u8 = 3 ;
225
+ for attempt in 1 .. {
226
+ match f ( ) {
227
+ Ok ( result) => return Ok ( result) ,
228
+ Err ( err) => {
229
+ if attempt > MAX_ATTEMPTS {
230
+ return Err ( err) ;
231
+ } else {
232
+ log:: warn!( "got error {:?} on attempt {}, will try again" , err, attempt) ;
233
+ }
234
+ }
235
+ }
236
+ }
237
+ unreachable ! ( )
238
+ }
239
+
223
240
/// Index methods.
224
241
impl BuildQueue {
225
242
/// Updates registry index repository and adds new crates into build queue.
@@ -324,21 +341,23 @@ impl BuildQueue {
324
341
. map ( |r| PackageKind :: Registry ( r. as_str ( ) ) )
325
342
. unwrap_or ( PackageKind :: CratesIo ) ;
326
343
327
- match builder
328
- . update_toolchain ( )
329
- . context ( "Updating toolchain failed, locking queue" )
330
- {
344
+ match retry ( || {
345
+ builder
346
+ . update_toolchain ( )
347
+ . context ( "Updating toolchain failed, locking queue" )
348
+ } ) {
331
349
Err ( err) => {
332
350
report_error ( & err) ;
333
351
self . lock ( ) ?;
334
352
return Err ( err) ;
335
353
}
336
354
Ok ( true ) => {
337
355
// toolchain has changed, purge caches
338
- if let Err ( err) = builder
339
- . purge_caches ( )
340
- . context ( "purging rustwide caches failed, locking queue" )
341
- {
356
+ if let Err ( err) = retry ( || {
357
+ builder
358
+ . purge_caches ( )
359
+ . context ( "purging rustwide caches failed, locking queue" )
360
+ } ) {
342
361
report_error ( & err) ;
343
362
self . lock ( ) ?;
344
363
return Err ( err) ;
You can’t perform that action at this time.
0 commit comments