turbo_tasks_testing/
retry.rs

1use std::{future::Future, time::Duration};
2
3pub fn retry<A, F, R, E>(
4    mut args: A,
5    f: F,
6    max_retries: usize,
7    mut timeout: Duration,
8) -> Result<R, E>
9where
10    F: Fn(&mut A) -> Result<R, E>,
11{
12    let mut retries = 0usize;
13    loop {
14        match f(&mut args) {
15            Ok(value) => return Ok(value),
16            Err(e) => {
17                if retries >= max_retries {
18                    return Err(e);
19                }
20                retries += 1;
21                std::thread::sleep(timeout);
22                timeout += timeout;
23            }
24        }
25    }
26}
27
28pub async fn retry_async<A, F, Fut, R, E>(
29    mut args: A,
30    f: F,
31    max_retries: usize,
32    mut timeout: Duration,
33) -> Result<R, E>
34where
35    F: Fn(&mut A) -> Fut,
36    Fut: Future<Output = Result<R, E>>,
37{
38    let mut retries = 0usize;
39    loop {
40        match f(&mut args).await {
41            Ok(value) => return Ok(value),
42            Err(e) => {
43                if retries >= max_retries {
44                    return Err(e);
45                }
46                retries += 1;
47                tokio::time::sleep(timeout).await;
48                timeout += timeout;
49            }
50        }
51    }
52}