From 54858361a95935e6cd7170a09c7c8d43a2481bae Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 27 Feb 2026 10:41:48 +0000 Subject: [PATCH] feat: mutex to prevent fetching from multiple IMAP servers at the same time --- src/context.rs | 9 +++++++++ src/imap.rs | 1 + 2 files changed, 10 insertions(+) diff --git a/src/context.rs b/src/context.rs index 6f57fc52b..a7070d464 100644 --- a/src/context.rs +++ b/src/context.rs @@ -242,6 +242,14 @@ pub struct InnerContext { /// Mutex to prevent running housekeeping from multiple threads at once. pub(crate) housekeeping_mutex: Mutex<()>, + /// Mutex to prevent multiple IMAP loops from fetching the messages at once. + /// + /// Without this mutex IMAP loops may waste traffic downloading the same message + /// from multiple IMAP servers and create multiple copies of the same message + /// in the database if the check for duplicates and creating a message + /// happens in separate database transactions. + pub(crate) fetch_msgs_mutex: Mutex<()>, + pub(crate) translated_stockstrings: StockStrings, pub(crate) events: Events, @@ -482,6 +490,7 @@ impl Context { oauth2_mutex: Mutex::new(()), wrong_pw_warning_mutex: Mutex::new(()), housekeeping_mutex: Mutex::new(()), + fetch_msgs_mutex: Mutex::new(()), translated_stockstrings: stockstrings, events, scheduler: SchedulerState::new(), diff --git a/src/imap.rs b/src/imap.rs index 89cadd6d7..96d9db50c 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -606,6 +606,7 @@ impl Imap { .await .context("prefetch")?; let read_cnt = msgs.len(); + let _fetch_msgs_lock_guard = context.fetch_msgs_mutex.lock().await; let mut uids_fetch: Vec = Vec::new(); let mut available_post_msgs: Vec = Vec::new();