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 {
220220 }
221221}
222222
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+
223240/// Index methods.
224241impl BuildQueue {
225242 /// Updates registry index repository and adds new crates into build queue.
@@ -324,21 +341,23 @@ impl BuildQueue {
324341 . map ( |r| PackageKind :: Registry ( r. as_str ( ) ) )
325342 . unwrap_or ( PackageKind :: CratesIo ) ;
326343
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+ } ) {
331349 Err ( err) => {
332350 report_error ( & err) ;
333351 self . lock ( ) ?;
334352 return Err ( err) ;
335353 }
336354 Ok ( true ) => {
337355 // 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+ } ) {
342361 report_error ( & err) ;
343362 self . lock ( ) ?;
344363 return Err ( err) ;
You can’t perform that action at this time.
0 commit comments