Tiny remove unused code (#17047)
This commit is contained in:
@@ -55,34 +55,6 @@ pub enum RetryError {
|
|||||||
pub struct RetryExecutor;
|
pub struct RetryExecutor;
|
||||||
|
|
||||||
impl RetryExecutor {
|
impl RetryExecutor {
|
||||||
/// Execute an async operation with retries and backoff.
|
|
||||||
/// The `operation` closure is invoked each attempt with the attempt index.
|
|
||||||
pub async fn execute_with_retry<F, Fut, T>(
|
|
||||||
config: &RetryConfig,
|
|
||||||
mut operation: F,
|
|
||||||
) -> Result<T, RetryError>
|
|
||||||
where
|
|
||||||
F: FnMut(u32) -> Fut,
|
|
||||||
Fut: std::future::Future<Output = Result<T, ()>>,
|
|
||||||
{
|
|
||||||
let max = config.max_retries.max(1);
|
|
||||||
let mut attempt: u32 = 0;
|
|
||||||
loop {
|
|
||||||
match operation(attempt).await {
|
|
||||||
Ok(val) => return Ok(val),
|
|
||||||
Err(_) => {
|
|
||||||
let is_last = attempt + 1 >= max;
|
|
||||||
if is_last {
|
|
||||||
return Err(RetryError::MaxRetriesExceeded);
|
|
||||||
}
|
|
||||||
let delay = BackoffCalculator::calculate_delay(config, attempt);
|
|
||||||
attempt += 1;
|
|
||||||
tokio::time::sleep(delay).await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Execute an operation that returns an HTTP Response with retries and backoff.
|
/// Execute an operation that returns an HTTP Response with retries and backoff.
|
||||||
///
|
///
|
||||||
/// Usage pattern:
|
/// Usage pattern:
|
||||||
@@ -220,54 +192,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
|
||||||
async fn test_execute_with_retry_success_after_failures() {
|
|
||||||
let cfg = base_retry_config();
|
|
||||||
let remaining = Arc::new(AtomicU32::new(2));
|
|
||||||
let calls = Arc::new(AtomicU32::new(0));
|
|
||||||
|
|
||||||
let res: Result<u32, RetryError> = RetryExecutor::execute_with_retry(&cfg, {
|
|
||||||
let remaining = remaining.clone();
|
|
||||||
let calls = calls.clone();
|
|
||||||
move |_attempt| {
|
|
||||||
calls.fetch_add(1, Ordering::Relaxed);
|
|
||||||
let remaining = remaining.clone();
|
|
||||||
async move {
|
|
||||||
if remaining
|
|
||||||
.fetch_update(Ordering::AcqRel, Ordering::Acquire, |v| v.checked_sub(1))
|
|
||||||
.is_ok()
|
|
||||||
{
|
|
||||||
Err(())
|
|
||||||
} else {
|
|
||||||
Ok(42u32)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.await;
|
|
||||||
|
|
||||||
assert!(res.is_ok());
|
|
||||||
assert_eq!(res.unwrap(), 42);
|
|
||||||
assert_eq!(calls.load(Ordering::Relaxed), 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::test]
|
|
||||||
async fn test_execute_with_retry_exhausted() {
|
|
||||||
let cfg = base_retry_config();
|
|
||||||
let calls = Arc::new(AtomicU32::new(0));
|
|
||||||
let res: Result<u32, RetryError> = RetryExecutor::execute_with_retry(&cfg, {
|
|
||||||
let calls = calls.clone();
|
|
||||||
move |_attempt| {
|
|
||||||
calls.fetch_add(1, Ordering::Relaxed);
|
|
||||||
async move { Err(()) }
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.await;
|
|
||||||
|
|
||||||
assert!(matches!(res, Err(RetryError::MaxRetriesExceeded)));
|
|
||||||
assert_eq!(calls.load(Ordering::Relaxed), cfg.max_retries);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_execute_response_with_retry_success_path_and_hooks() {
|
async fn test_execute_response_with_retry_success_path_and_hooks() {
|
||||||
let cfg = base_retry_config();
|
let cfg = base_retry_config();
|
||||||
|
|||||||
Reference in New Issue
Block a user