From 8e7583a32f7297fe2ea81c45fe319dd76e080b31 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sun, 29 Nov 2020 19:33:23 +0200 Subject: [PATCH] melib/imap: don't clear mailbox counts before fetching --- melib/src/backends.rs | 13 ++++--------- melib/src/backends/imap.rs | 27 +++++++++++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/melib/src/backends.rs b/melib/src/backends.rs index 8e8e8f81f..4b01d47a7 100644 --- a/melib/src/backends.rs +++ b/melib/src/backends.rs @@ -647,15 +647,10 @@ impl LazyCountSet { } } - pub fn insert_existing_set(&mut self, set: BTreeSet) -> bool { - if self.not_yet_seen < set.len() { - false - } else { - let old_len = self.set.len(); - self.set.extend(set.into_iter()); - self.not_yet_seen -= self.set.len() - old_len; - true - } + pub fn insert_existing_set(&mut self, set: BTreeSet) { + let old_len = self.set.len(); + self.set.extend(set.into_iter()); + self.not_yet_seen = self.not_yet_seen.saturating_sub(self.set.len() - old_len); } #[inline(always)] diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 135ab90ff..cd4b809c3 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -343,12 +343,24 @@ impl MailBackend for ImapType { cache_handle, }; + /* do this in a closure to prevent recursion limit error in async_stream macro */ + let prepare_cl = |f: &ImapMailbox| { + f.set_warm(true); + if let Ok(mut exists) = f.exists.lock() { + let total = exists.len(); + exists.clear(); + exists.set_not_yet_seen(total); + } + if let Ok(mut unseen) = f.unseen.lock() { + let total = unseen.len(); + unseen.clear(); + unseen.set_not_yet_seen(total); + } + }; Ok(Box::pin(async_stream::try_stream! { { let f = &state.uid_store.mailboxes.lock().await[&mailbox_hash]; - f.exists.lock().unwrap().clear(); - f.unseen.lock().unwrap().clear(); - f.set_warm(true); + prepare_cl(f); if f.no_select { yield vec![]; return; @@ -1629,7 +1641,7 @@ async fn fetch_hlpr(state: &mut FetchState) -> Result> { let f = &state.uid_store.mailboxes.lock().await[&state.mailbox_hash]; (f.exists.clone(), f.unseen.clone()) }; - unseen.lock().unwrap().insert_set( + unseen.lock().unwrap().insert_existing_set( cached_payload .iter() .filter_map(|env| { @@ -1641,10 +1653,9 @@ async fn fetch_hlpr(state: &mut FetchState) -> Result> { }) .collect(), ); - mailbox_exists - .lock() - .unwrap() - .insert_set(cached_payload.iter().map(|env| env.hash()).collect::<_>()); + mailbox_exists.lock().unwrap().insert_existing_set( + cached_payload.iter().map(|env| env.hash()).collect::<_>(), + ); return Ok(cached_payload); } }