state: Send a warning trace whenever the state db lock is poisoned
This commit is contained in:
15
src/state.rs
15
src/state.rs
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user