From: Timo Sirainen Date: Wed, 25 Feb 2009 17:22:33 +0000 (-0500) Subject: Mail copying: Avoid updating cache file because of copying. X-Git-Tag: 2.0.alpha1~1038^2~75 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aa247243412a49f9bdebf7255e131dc6ece4ed46;p=thirdparty%2Fdovecot%2Fcore.git Mail copying: Avoid updating cache file because of copying. The mail is being opened in any case, so it's unlikely to help anything. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index dc86eecd50..548184d9ef 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -118,6 +118,7 @@ struct mail_vfuncs cydir_mail_vfuncs = { index_mail_free, index_mail_set_seq, index_mail_set_uid, + index_mail_set_uid_cache_updates, index_mail_get_flags, index_mail_get_keywords, diff --git a/src/lib-storage/index/dbox/dbox-mail.c b/src/lib-storage/index/dbox/dbox-mail.c index 0edcc912fa..630fd2523f 100644 --- a/src/lib-storage/index/dbox/dbox-mail.c +++ b/src/lib-storage/index/dbox/dbox-mail.c @@ -307,6 +307,7 @@ struct mail_vfuncs dbox_mail_vfuncs = { index_mail_free, index_mail_set_seq, index_mail_set_uid, + index_mail_set_uid_cache_updates, index_mail_get_flags, index_mail_get_keywords, diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 1c0487ffd7..01eb811755 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1312,6 +1312,13 @@ bool index_mail_set_uid(struct mail *_mail, uint32_t uid) } } +void index_mail_set_uid_cache_updates(struct mail *_mail, bool set) +{ + struct index_mail *mail = (struct index_mail *)_mail; + + mail->data.no_caching = set || mail->data.forced_no_caching; +} + void index_mail_free(struct mail *_mail) { struct index_mail *mail = (struct index_mail *)_mail; @@ -1369,6 +1376,7 @@ void index_mail_cache_parse_deinit(struct mail *_mail, time_t received_date, /* we're going to delete this mail anyway, don't bother trying to update cache file */ mail->data.no_caching = TRUE; + mail->data.forced_no_caching = TRUE; } /* This is needed with 0 byte mails to get hdr=NULL call done. */ @@ -1467,6 +1475,7 @@ void index_mail_set_cache_corrupted(struct mail *mail, imail->trans->trans); imail->data.no_caching = TRUE; + imail->data.forced_no_caching = TRUE; mail_cache_set_corrupted(imail->ibox->cache, "Broken %s for mail UID %u", field_name, mail->uid); diff --git a/src/lib-storage/index/index-mail.h b/src/lib-storage/index/index-mail.h index d63cc9d8ce..8b117e37a3 100644 --- a/src/lib-storage/index/index-mail.h +++ b/src/lib-storage/index/index-mail.h @@ -106,6 +106,7 @@ struct index_mail_data { unsigned int messageparts_saved_to_cache:1; unsigned int header_parsed:1; unsigned int no_caching:1; + unsigned int forced_no_caching:1; unsigned int destroying_stream:1; }; @@ -149,6 +150,7 @@ void index_mail_init(struct index_mail *mail, void index_mail_set_seq(struct mail *mail, uint32_t seq); bool index_mail_set_uid(struct mail *mail, uint32_t uid); +void index_mail_set_uid_cache_updates(struct mail *mail, bool set); void index_mail_close(struct mail *mail); void index_mail_free(struct mail *mail); diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index da1a260f38..66500a45ec 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -509,6 +509,7 @@ struct mail_vfuncs maildir_mail_vfuncs = { index_mail_free, index_mail_set_seq, index_mail_set_uid, + index_mail_set_uid_cache_updates, index_mail_get_flags, index_mail_get_keywords, diff --git a/src/lib-storage/index/mbox/mbox-mail.c b/src/lib-storage/index/mbox/mbox-mail.c index 8487a60dcb..9111999d7d 100644 --- a/src/lib-storage/index/mbox/mbox-mail.c +++ b/src/lib-storage/index/mbox/mbox-mail.c @@ -342,6 +342,7 @@ struct mail_vfuncs mbox_mail_vfuncs = { index_mail_free, mbox_mail_set_seq, mbox_mail_set_uid, + index_mail_set_uid_cache_updates, index_mail_get_flags, index_mail_get_keywords, diff --git a/src/lib-storage/index/raw/raw-mail.c b/src/lib-storage/index/raw/raw-mail.c index 18a4690bd3..2a1736b196 100644 --- a/src/lib-storage/index/raw/raw-mail.c +++ b/src/lib-storage/index/raw/raw-mail.c @@ -111,6 +111,7 @@ struct mail_vfuncs raw_mail_vfuncs = { index_mail_free, index_mail_set_seq, index_mail_set_uid, + index_mail_set_uid_cache_updates, index_mail_get_flags, index_mail_get_keywords, diff --git a/src/lib-storage/mail-copy.c b/src/lib-storage/mail-copy.c index 888d175e9c..057cb8e714 100644 --- a/src/lib-storage/mail-copy.c +++ b/src/lib-storage/mail-copy.c @@ -7,10 +7,15 @@ int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail) { + struct mail_private *pmail = (struct mail_private *)mail; struct istream *input; const char *from_envelope, *guid; time_t received_date; + /* we need to open the file in any case. caching metadata is unlikely + to help anything. */ + pmail->v.set_uid_cache_updates(mail, TRUE); + if (mail_get_stream(mail, NULL, NULL, &input) < 0) return -1; diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 0286a85726..505421cdd6 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -228,6 +228,7 @@ struct mail_vfuncs { void (*free)(struct mail *mail); void (*set_seq)(struct mail *mail, uint32_t seq); bool (*set_uid)(struct mail *mail, uint32_t uid); + void (*set_uid_cache_updates)(struct mail *mail, bool set); enum mail_flags (*get_flags)(struct mail *mail); const char *const *(*get_keywords)(struct mail *mail);