main: Implement exponential backoff in the feed fetcher loop

Backoff with an exponentially increasing delay when feeds can't be
fetched or parsed, with a maximum of 6h (after which retry every 6h)
This commit is contained in:
2025-05-03 15:09:13 +00:00
parent 5c009476d6
commit c8c9021b78
4 changed files with 11 additions and 5 deletions

2
Cargo.lock generated
View File

@ -1295,7 +1295,7 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
[[package]] [[package]]
name = "matrix-feedbot" name = "matrix-feedbot"
version = "0.1.2" version = "0.1.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "matrix-feedbot" name = "matrix-feedbot"
version = "0.1.3" version = "0.1.4"
edition = "2021" edition = "2021"
license = "GPL-3.0-or-later" license = "GPL-3.0-or-later"
authors = ["mirsal <mirsal@mirsal.fr>"] authors = ["mirsal <mirsal@mirsal.fr>"]

View File

@ -59,6 +59,7 @@ async fn main() -> anyhow::Result<()> {
let handles: Vec<JoinHandle<_>> = config.feeds.clone().into_iter().map(|feed_config| { let handles: Vec<JoinHandle<_>> = config.feeds.clone().into_iter().map(|feed_config| {
let state_db = Arc::clone(&state_db); let state_db = Arc::clone(&state_db);
let bcast_tx = bcast_tx.clone(); let bcast_tx = bcast_tx.clone();
let mut backoff: u64 = feed_config.delay;
tokio::spawn(async move { tokio::spawn(async move {
@ -80,10 +81,15 @@ async fn main() -> anyhow::Result<()> {
}; };
let feed = if feed.is_none() { let feed = if feed.is_none() {
debug!("Sleeping for {} seconds before refreshing this feed", feed_config.delay); backoff = max(backoff * 2, 6 * 3600);
sleep(Duration::from_secs(feed_config.delay)).await; error!("Backing off for {} seconds", backoff);
sleep(Duration::from_secs(backoff)).await;
continue; continue;
} else { } else {
if backoff != feed_config.delay {
debug!("Resetting exponential backoff timer");
backoff = feed_config.delay;
}
feed.unwrap() feed.unwrap()
}; };

View File

@ -98,7 +98,7 @@ pub async fn login_and_sync<T: Clone>(
client client
.matrix_auth() .matrix_auth()
.login_username(username, password) .login_username(username, password)
.initial_device_display_name("bender v0.1.3") .initial_device_display_name("bender v0.1.4")
.await?; .await?;
info!("logged in as {username}"); info!("logged in as {username}");