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::{
error::Error,
sync::{Arc, Mutex}
sync::{Arc, Mutex, MutexGuard}
};
use tokio::fs;
use chrono::{ DateTime, Utc };
use tracing::{ info, debug };
use tracing::{ warn, info, debug };
use serde_yaml::mapping::Mapping as FeedReaderState;
@ -48,6 +48,13 @@ impl FeedReaderStateDb {
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(
&self,
uri: &str,
@ -56,7 +63,7 @@ impl FeedReaderStateDb {
{
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();
@ -65,7 +72,7 @@ impl FeedReaderStateDb {
#[tracing::instrument(ret, level="debug")]
pub fn get(&self, uri: &str) -> Option<DateTime<Utc>> {
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),
None => None
}