state: Send a warning trace whenever the state db lock is poisoned

This commit is contained in:
2025-05-15 19:30:05 +00:00
parent e771639856
commit 86c6ec26f5

View File

@ -19,13 +19,13 @@
use std::{ use std::{
error::Error, error::Error,
sync::{Arc, Mutex} sync::{Arc, Mutex, MutexGuard}
}; };
use tokio::fs; use tokio::fs;
use chrono::{ DateTime, Utc }; use chrono::{ DateTime, Utc };
use tracing::{ info, debug }; use tracing::{ warn, info, debug };
use serde_yaml::mapping::Mapping as FeedReaderState; use serde_yaml::mapping::Mapping as FeedReaderState;
@ -48,6 +48,13 @@ impl FeedReaderStateDb {
Ok(db.clone()) Ok(db.clone())
} }
fn lock_state(&self) -> MutexGuard<FeedReaderState> {
self.state.lock().unwrap_or_else(|e| {
warn!("State db mutex has been poisoned, continuing...");
e.into_inner()
})
}
pub async fn set( pub async fn set(
&self, &self,
uri: &str, uri: &str,
@ -56,7 +63,7 @@ impl FeedReaderStateDb {
{ {
debug!("Updating feed reader state"); debug!("Updating feed reader state");
self.state.lock().unwrap().insert(uri.into(), dt.timestamp().into()); self.lock_state().insert(uri.into(), dt.timestamp().into());
} }
self.persist().await.unwrap(); self.persist().await.unwrap();
@ -65,7 +72,7 @@ impl FeedReaderStateDb {
#[tracing::instrument(ret, level="debug")] #[tracing::instrument(ret, level="debug")]
pub fn get(&self, uri: &str) -> Option<DateTime<Utc>> { pub fn get(&self, uri: &str) -> Option<DateTime<Utc>> {
debug!("Retrieving state for feed {}", uri); debug!("Retrieving state for feed {}", uri);
match self.state.lock().unwrap().get(uri) { match self.lock_state().get(uri) {
Some(t) => DateTime::from_timestamp((*t).as_i64().unwrap(), 0), Some(t) => DateTime::from_timestamp((*t).as_i64().unwrap(), 0),
None => None None => None
} }