changeset 22304:e181b398eac9

imapc: Prefech - Initialize cached stream only if needed 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.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 03 Jul 2017 21:08:02 +0300
parents 15823e373013
children 91b8f2b6ebcb
files 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
diffstat 3 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c	Fri Jun 30 13:46:22 2017 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c	Mon Jul 03 21:08:02 2017 +0300
@@ -371,6 +371,15 @@
 	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 @@
 	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 &&
--- a/src/lib-storage/index/imapc/imapc-mail.c	Fri Jun 30 13:46:22 2017 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Mon Jul 03 21:08:02 2017 +0300
@@ -302,6 +302,10 @@
 		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() */
--- a/src/lib-storage/index/imapc/imapc-mail.h	Fri Jun 30 13:46:22 2017 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail.h	Mon Jul 03 21:08:02 2017 +0300
@@ -33,6 +33,7 @@
 		 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);