Skip to content

Commit

Permalink
Fix an unexpected panic: users may unsubscribe a feed while fetching it
Browse files Browse the repository at this point in the history
  • Loading branch information
iovxw committed Apr 19, 2020
1 parent a9c045e commit 5a919b8
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 19 deletions.
45 changes: 27 additions & 18 deletions src/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,22 +110,27 @@ impl Database {
})
}

pub fn get_or_update_down_time(&mut self, rss_link: &str) -> Duration {
/// Return `None` if feed not found
pub fn get_or_update_down_time(&mut self, rss_link: &str) -> Option<Duration> {
let feed_id = gen_hash(&rss_link);
let feed = self.feeds.get_mut(&feed_id).unwrap();
let feed = self.feeds.get_mut(&feed_id)?;
let now = SystemTime::now();
if let Some(t) = feed.down_time {
now.duration_since(t).unwrap_or_default()
Some(now.duration_since(t).unwrap_or_default())
} else {
feed.down_time = Some(now);
Duration::default()
Some(Duration::default())
}
}

pub fn reset_down_time(&mut self, rss_link: &str) {
pub fn reset_down_time(&mut self, rss_link: &str) -> bool {
let feed_id = gen_hash(&rss_link);
let feed = self.feeds.get_mut(&feed_id).unwrap();
feed.down_time = None;
self.feeds
.get_mut(&feed_id)
.map(|feed| {
feed.down_time = None;
})
.is_some()
}

pub fn is_subscribed(&self, subscriber: SubscriberId, rss_link: &str) -> bool {
Expand Down Expand Up @@ -197,30 +202,34 @@ impl Database {
Some(result)
}

pub fn delete_subscriber(&mut self, subscriber: SubscriberId) {
pub fn delete_subscriber(&mut self, subscriber: SubscriberId) -> bool {
self.subscribed_feeds(subscriber)
.map(|feeds| {
for feed in feeds {
let _ = self.unsubscribe(subscriber, &feed.link);
}
})
.unwrap_or_default();
.is_some()
}

pub fn update_subscriber(&mut self, from: SubscriberId, to: SubscriberId) {
let feeds = self.subscribers.remove(&from).unwrap();
for feed_id in &feeds {
let feed = self.feeds.get_mut(&feed_id).unwrap();
feed.subscribers.remove(&from);
feed.subscribers.insert(to);
}
self.subscribers.insert(to, feeds);
pub fn update_subscriber(&mut self, from: SubscriberId, to: SubscriberId) -> bool {
self.subscribers
.remove(&from)
.map(|feeds| {
for feed_id in &feeds {
let feed = self.feeds.get_mut(&feed_id).unwrap();
feed.subscribers.remove(&from);
feed.subscribers.insert(to);
}
self.subscribers.insert(to, feeds);
})
.is_some()
}

/// Update the feed in database, return updates
pub fn update(&mut self, rss_link: &str, new_feed: feed::Rss) -> Vec<FeedUpdate> {
let feed_id = gen_hash(&rss_link);
if self.feeds.get(&feed_id).is_none() {
if !self.feeds.contains_key(&feed_id) {
return Vec::new();
}

Expand Down
6 changes: 5 additions & 1 deletion src/fetcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,12 @@ async fn fetch_and_push_updates(
Ok(feed) => feed,
Err(e) => {
let down_time = db.lock().unwrap().get_or_update_down_time(&feed.link);
if down_time.is_none() {
// user unsubscribed while fetching the feed
return Ok(());
}
// 5 days
if down_time.as_secs() > 5 * 24 * 60 * 60 {
if down_time.unwrap().as_secs() > 5 * 24 * 60 * 60 {
db.lock().unwrap().reset_down_time(&feed.link);
let msg = format!(
"《<a href=\"{}\">{}</a>》\
Expand Down

0 comments on commit 5a919b8

Please sign in to comment.