Skip to content

Commit 566ace1

Browse files
committed
retry toolchain update, only lock queue after 3 failed attempts
1 parent c4f9e90 commit 566ace1

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

src/build_queue.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff 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.
224241
impl 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);

0 commit comments

Comments
 (0)