Skip to content

Commit a074c8a

Browse files
committed
sleep between toolchain update attempts, max_attempts as argument
1 parent 19186b8 commit a074c8a

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

src/build_queue.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ use log::{debug, info};
1111

1212
use git2::Oid;
1313
use std::sync::Arc;
14+
use std::thread;
15+
use std::time::Duration;
1416

1517
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize)]
1618
pub(crate) struct QueuedCrate {
@@ -220,20 +222,22 @@ impl BuildQueue {
220222
}
221223
}
222224

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> {
225226
for attempt in 1.. {
226227
match f() {
227228
Ok(result) => return Ok(result),
228229
Err(err) => {
229-
if attempt > MAX_ATTEMPTS {
230+
if attempt > max_attempts {
230231
return Err(err);
231232
} else {
233+
let sleep_for = 2u32.pow(attempt);
232234
log::warn!(
233-
"got error on attempt {}, will try again:\n{:?}",
235+
"got error on attempt {}, will try again after {}s:\n{:?}",
234236
attempt,
237+
sleep_for,
235238
err
236239
);
240+
thread::sleep(Duration::from_secs(sleep_for as u64));
237241
}
238242
}
239243
}
@@ -345,23 +349,29 @@ impl BuildQueue {
345349
.map(|r| PackageKind::Registry(r.as_str()))
346350
.unwrap_or(PackageKind::CratesIo);
347351

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+
) {
353360
Err(err) => {
354361
report_error(&err);
355362
self.lock()?;
356363
return Err(err);
357364
}
358365
Ok(true) => {
359366
// 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+
) {
365375
report_error(&err);
366376
self.lock()?;
367377
return Err(err);

0 commit comments

Comments
 (0)