From 7cf4bcaca210f829f5ac92f5291afbd7db876091 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 30 Jan 2022 19:28:30 +0000 Subject: [PATCH] imap: call delete_expired_imap_messages() less often This operation takes roughly 0.3 s on a moderate size database. Calling it once before scanning all folders and scanning the watched folder instead of each time after downloading a message from a folder speeds up IMAP loop. --- CHANGELOG.md | 1 + src/imap.rs | 4 ---- src/scheduler.rs | 11 ++++++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ad5e3b42..968aa57c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ ### Fixes - fix splitting off text from webxdc messages #3032 +- call slow `delete_expired_imap_messages()` less often #3037 ## 1.72.0 diff --git a/src/imap.rs b/src/imap.rs index 6115e58b0..862fc3fb0 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -28,7 +28,6 @@ use crate::context::Context; use crate::dc_receive_imf::{ dc_receive_imf_inner, from_field_to_contact_id, get_prefetch_parent_message, ReceivedMsg, }; -use crate::ephemeral::delete_expired_imap_messages; use crate::events::EventType; use crate::headerdef::{HeaderDef, HeaderDefMap}; use crate::job::{self, Action}; @@ -459,9 +458,6 @@ impl Imap { .await .context("fetch_new_messages")?; - // Mark expired messages for deletion. - delete_expired_imap_messages(context).await?; - self.move_messages(context, watch_folder) .await .context("move_messages")?; diff --git a/src/scheduler.rs b/src/scheduler.rs index 7489961bc..2cff9b7d5 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -1,4 +1,4 @@ -use anyhow::{bail, Result}; +use anyhow::{bail, Context as _, Result}; use async_std::prelude::*; use async_std::{ channel::{self, Receiver, Sender}, @@ -8,6 +8,7 @@ use async_std::{ use crate::config::Config; use crate::context::Context; use crate::dc_tools::maybe_add_time_based_warnings; +use crate::ephemeral::delete_expired_imap_messages; use crate::imap::Imap; use crate::job::{self, Thread}; use crate::smtp::{send_smtp_messages, Smtp}; @@ -160,6 +161,14 @@ async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder: Config) -> Int return connection.fake_idle(ctx, Some(watch_folder)).await; } + // Mark expired messages for deletion. + if let Err(err) = delete_expired_imap_messages(ctx) + .await + .context("delete_expired_imap_messages failed") + { + warn!(ctx, "{:#}", err); + } + // Scan other folders before fetching from watched folder. This may result in the // messages being moved into the watched folder, for example from the Spam folder to // the Inbox folder.