From be1d87c3c3688a44328807bae0ef80cf314572aa Mon Sep 17 00:00:00 2001 From: holger krekel Date: Sat, 16 Apr 2022 17:16:22 +0200 Subject: [PATCH 1/2] do imap expiration/deletion after fetching messages, to avoid unneccessary delays. --- CHANGELOG.md | 1 + src/scheduler.rs | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27304c77b..8c335f911 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - Further improve finding the correct server after logging in #3208 - `get_connectivity_html()` returns HTML as non-scalable #3213 - add update-serial to `DC_EVENT_WEBXDC_STATUS_UPDATE` #3215 +- Speed up message receiving via IMAP a bit #3225 ## 1.77.0 diff --git a/src/scheduler.rs b/src/scheduler.rs index 6eb1886c9..87d8c234a 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -168,6 +168,13 @@ async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder: Config) -> Int return connection.fake_idle(ctx, Some(watch_folder)).await; } + // Fetch the watched folder. + if let Err(err) = connection.fetch_move_delete(ctx, &watch_folder).await { + connection.trigger_reconnect(ctx).await; + warn!(ctx, "{:#}", err); + return InterruptInfo::new(false); + } + // Mark expired messages for deletion. if let Err(err) = delete_expired_imap_messages(ctx) .await @@ -176,13 +183,6 @@ async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder: Config) -> Int warn!(ctx, "{:#}", err); } - // Fetch the watched folder. - if let Err(err) = connection.fetch_move_delete(ctx, &watch_folder).await { - connection.trigger_reconnect(ctx).await; - warn!(ctx, "{:#}", err); - return InterruptInfo::new(false); - } - // Scan additional folders only after finishing fetching the watched folder. // // On iOS the application has strictly limited time to work in background, so we may not From 86c884fe1edfc3a39fb17bb5be98f7f852793542 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 17 Apr 2022 09:47:17 +0000 Subject: [PATCH 2/2] Update the comment before `delete_expired_imap_messages` --- src/scheduler.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/scheduler.rs b/src/scheduler.rs index 87d8c234a..91858038f 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -175,7 +175,10 @@ async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder: Config) -> Int return InterruptInfo::new(false); } - // Mark expired messages for deletion. + // Mark expired messages for deletion. Marked messages will be deleted from the server + // on the next iteration of `fetch_move_delete`. `delete_expired_imap_messages` is not + // called right before `fetch_move_delete` because it is not well optimized and would + // otherwise slow down message fetching. if let Err(err) = delete_expired_imap_messages(ctx) .await .context("delete_expired_imap_messages failed")