]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Expunging now uses GUID only if it's in cache.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 25 Jan 2017 21:26:35 +0000 (23:26 +0200)
committerGitLab <gitlab@git.dovecot.net>
Sat, 4 Feb 2017 13:38:22 +0000 (15:38 +0200)
Otherwise the GUID lookup may be expensive, which is especially bad when
deleting a large number of mails.

src/lib-storage/index/index-mail.c

index 2cd617e71495a7d317f9b557b8d631c273b146cc..ade17d9ccfe8b00b4a58fa0c8503727850559779 100644 (file)
@@ -2161,9 +2161,11 @@ void index_mail_update_pvt_modseq(struct mail *mail, uint64_t min_pvt_modseq)
 
 void index_mail_expunge(struct mail *mail)
 {
+       enum mail_lookup_abort old_abort = mail->lookup_abort;
        const char *value;
        guid_128_t guid_128;
 
+       mail->lookup_abort = MAIL_LOOKUP_ABORT_NOT_IN_CACHE;
        if (mail_get_special(mail, MAIL_FETCH_GUID, &value) < 0)
                mail_index_expunge(mail->transaction->itrans, mail->seq);
        else {
@@ -2171,6 +2173,7 @@ void index_mail_expunge(struct mail *mail)
                mail_index_expunge_guid(mail->transaction->itrans,
                                        mail->seq, guid_128);
        }
+       mail->lookup_abort = old_abort;
 }
 
 static void index_mail_parse(struct mail *mail, bool parse_body)