]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Prefech - Initialize cached stream only if needed
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 3 Jul 2017 18:08:02 +0000 (21:08 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 4 Jul 2017 08:10:31 +0000 (11:10 +0300)
If the mail is immediately accessed for other purposes (e.g. fetching
message flags), there's no need to go through all the trouble of
initializing the mail stream.

src/lib-storage/index/imapc/imapc-mail-fetch.c
src/lib-storage/index/imapc/imapc-mail.c
src/lib-storage/index/imapc/imapc-mail.h

index 0fbd29a75a54a3be305608979b0646fd08b8cd2a..ad72a54a75d0feee5c43c47b3f0bb681331c89b9 100644 (file)
@@ -371,6 +371,15 @@ imapc_mail_get_wanted_fetch_fields(struct imapc_mail *mail)
        return fields;
 }
 
+void imapc_mail_try_init_stream_from_cache(struct imapc_mail *mail)
+{
+       struct mail *_mail = &mail->imail.mail.mail;
+       struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+
+       if (mbox->prev_mail_cache.uid == _mail->uid)
+               imapc_mail_cache_get(mail, &mbox->prev_mail_cache);
+}
+
 bool imapc_mail_prefetch(struct mail *_mail)
 {
        struct imapc_mail *mail = (struct imapc_mail *)_mail;
@@ -379,10 +388,13 @@ bool imapc_mail_prefetch(struct mail *_mail)
        enum mail_fetch_field fields;
        const char *const *headers = NULL;
 
-       if (mbox->prev_mail_cache.uid == _mail->uid)
-               imapc_mail_cache_get(mail, &mbox->prev_mail_cache);
        /* try to get as much from cache as possible */
        imapc_mail_update_access_parts(&mail->imail);
+       /* If mail is already cached we can avoid re-FETCHing the mail.
+          However, don't initialize the stream if we don't actually want to
+          access the mail. */
+       if (mail->imail.data.access_part != 0)
+               imapc_mail_try_init_stream_from_cache(mail);
 
        fields = imapc_mail_get_wanted_fetch_fields(mail);
        if (data->wanted_headers != NULL && data->stream == NULL &&
index 241ce91fe3e5a3ce5772b5e68881fd97667dee14..45fc902eb2089beee59150fa96467248ae33f8cc 100644 (file)
@@ -302,6 +302,10 @@ imapc_mail_get_stream(struct mail *_mail, bool get_body,
                data->hdr_size_set = FALSE;
        }
 
+       /* See if we can get it from cache. If the wanted_fields/headers are
+          set properly, this is usually already done by prefetching. */
+       imapc_mail_try_init_stream_from_cache(mail);
+
        if (data->stream == NULL) {
                if (!data->initialized) {
                        /* coming here from mail_set_seq() */
index ddc06ffcbf08b8f298e12ddf497458d72ade177c..0a7611b40e30ea9b6e290e8730b7e20b53487e90 100644 (file)
@@ -33,6 +33,7 @@ imapc_mail_alloc(struct mailbox_transaction_context *t,
                 struct mailbox_header_lookup_ctx *wanted_headers);
 int imapc_mail_fetch(struct mail *mail, enum mail_fetch_field fields,
                     const char *const *headers);
+void imapc_mail_try_init_stream_from_cache(struct imapc_mail *mail);
 bool imapc_mail_prefetch(struct mail *mail);
 void imapc_mail_fetch_flush(struct imapc_mailbox *mbox);
 void imapc_mail_init_stream(struct imapc_mail *mail);