turbo_tasks_testing/
retry.rs1use 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}