diff options
author | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2020-11-29 15:52:48 +0200 |
---|---|---|
committer | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2020-11-30 02:20:08 +0200 |
commit | 76c1c1a213fb35d882a82694da74b55b69d31c03 (patch) | |
tree | df7d4b21a3d046f6a2b07fa71ebb4f42cb5f946b /melib | |
parent | ddfadc748d73d0a5e0bd60b4a8aec9022836c604 (diff) |
melib/imap: don't examine unloaded mailboxes for updates
In examine_updates() which is periodically executed in the IMAP watch
thread, the mailbox's contents get fetched regardless if the user has
fetched the mailbox before. That means eg a large mailbox that was
unused by the user might perform a large fetch all of a sudden without
the user's knowledge/touch.
Add `warm` property in ImapMailbox that states whether the mailbox has
been loaded before in current execution.
Closes #88 IMAP: don't examine unloaded mailboxes for updates, just for message count stats
Diffstat (limited to 'melib')
-rw-r--r-- | melib/src/backends/imap.rs | 1 | ||||
-rw-r--r-- | melib/src/backends/imap/mailbox.rs | 19 | ||||
-rw-r--r-- | melib/src/backends/imap/watch.rs | 14 |
3 files changed, 34 insertions, 0 deletions
diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index e3186a65..135ab90f 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -348,6 +348,7 @@ impl MailBackend for ImapType { let f = &state.uid_store.mailboxes.lock().await[&mailbox_hash]; f.exists.lock().unwrap().clear(); f.unseen.lock().unwrap().clear(); + f.set_warm(true); if f.no_select { yield vec![]; return; diff --git a/melib/src/backends/imap/mailbox.rs b/melib/src/backends/imap/mailbox.rs index 7461e814..baa918ca 100644 --- a/melib/src/backends/imap/mailbox.rs +++ b/melib/src/backends/imap/mailbox.rs @@ -43,12 +43,31 @@ pub struct ImapMailbox { pub permissions: Arc<Mutex<MailboxPermissions>>, pub exists: Arc<Mutex<LazyCountSet>>, pub unseen: Arc<Mutex<LazyCountSet>>, + pub warm: Arc<Mutex<bool>>, } impl ImapMailbox { pub fn imap_path(&self) -> &str { &self.imap_path } + + /// Establish that mailbox contents have been fetched at least once during this execution + #[inline(always)] + pub fn set_warm(&self, new_value: bool) { + *self.warm.lock().unwrap() = new_value; + } + + /// Mailbox contents have been fetched at least once during this execution + #[inline(always)] + pub fn is_warm(&self) -> bool { + *self.warm.lock().unwrap() + } + + /// Mailbox contents have not been fetched at all during this execution + #[inline(always)] + pub fn is_cold(&self) -> bool { + !self.is_warm() + } } impl BackendMailbox for ImapMailbox { diff --git a/melib/src/backends/imap/watch.rs b/melib/src/backends/imap/watch.rs index b521970d..fe7cd87c 100644 --- a/melib/src/backends/imap/watch.rs +++ b/melib/src/backends/imap/watch.rs @@ -244,6 +244,20 @@ pub async fn examine_updates( uidvalidities.insert(mailbox_hash, select_response.uidvalidity); } } + if mailbox.is_cold() { + /* Mailbox hasn't been loaded yet */ + if let Ok(mut exists_lck) = mailbox.exists.lock() { + exists_lck.clear(); + exists_lck.set_not_yet_seen(select_response.exists); + } + if let Ok(mut unseen_lck) = mailbox.unseen.lock() { + unseen_lck.clear(); + unseen_lck.set_not_yet_seen(select_response.unseen); + } + mailbox.set_warm(true); + return Ok(()); + } + if debug!(select_response.recent > 0) { /* UID SEARCH RECENT */ conn.send_command(b"UID SEARCH RECENT").await?; |