#[macro_export]
macro_rules! backoff {
($backoff_secs:expr) => {{
$backoff_secs *= 2;
let jitter = rand::random::<u64>() % 10;
let backoff_secs = 60.min($backoff_secs + jitter);
tracing::debug(?backoff_secs, "Too many requests, backing off for {}s");
tokio::time::sleep(tokio::time::Duration::from_secs(backoff_secs)).await;
}};
}
#[macro_export]
macro_rules! with_exponential_backoff {
($operation:expr) => {{
let mut backoff_secs = 1;
loop {
match $operation {
Err(kxio::net::Error::Reqwest(err))
if err.status() == Some(kxio::net::StatusCode::TOO_MANY_REQUESTS) =>
{
$crate::backoff!(backoff_secs)
}
Err(kxio::net::Error::ResponseError { response })
if response.status() == kxio::net::StatusCode::TOO_MANY_REQUESTS =>
{
$crate::backoff!(backoff_secs)
}
Ok(response) if response.status() == kxio::net::StatusCode::TOO_MANY_REQUESTS => {
$crate::backoff!(backoff_secs)
}
result => break result,
}
}
}};
}