dovecot-2.2: imapc: Various optimization fixes to fetching messa...

dovecot at dovecot.org dovecot at dovecot.org
Mon May 4 15:33:17 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/d350a23207c2
changeset: 18512:d350a23207c2
user:      Timo Sirainen <tss at iki.fi>
date:      Mon May 04 18:31:27 2015 +0300
description:
imapc: Various optimization fixes to fetching messages' virtual size.

diffstat:

 src/lib-storage/index/imapc/imapc-mail-fetch.c |  11 ++++++-----
 src/lib-storage/index/imapc/imapc-mail.c       |  25 ++++++++++++++++++-------
 2 files changed, 24 insertions(+), 12 deletions(-)

diffs (96 lines):

diff -r 8f20aa806bcc -r d350a23207c2 src/lib-storage/index/imapc/imapc-mail-fetch.c
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c	Mon May 04 18:15:00 2015 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c	Mon May 04 18:31:27 2015 +0300
@@ -212,7 +212,7 @@
 	str_printfa(str, "UID FETCH %u (", _mail->uid);
 	if ((fields & MAIL_FETCH_RECEIVED_DATE) != 0)
 		str_append(str, "INTERNALDATE ");
-	if ((fields & MAIL_FETCH_PHYSICAL_SIZE) != 0)
+	if ((fields & (MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE)) != 0)
 		str_append(str, "RFC822.SIZE ");
 	if ((fields & MAIL_FETCH_GUID) != 0) {
 		str_append(str, mbox->guid_fetch_field_name);
@@ -296,10 +296,11 @@
 	if ((data->wanted_fields & MAIL_FETCH_SAVE_DATE) != 0 &&
 	    data->save_date == (time_t)-1 && data->received_date == (time_t)-1)
 		fields |= MAIL_FETCH_RECEIVED_DATE;
-	if ((data->wanted_fields & MAIL_FETCH_PHYSICAL_SIZE) != 0 &&
+	if ((data->wanted_fields & (MAIL_FETCH_PHYSICAL_SIZE |
+				    MAIL_FETCH_VIRTUAL_SIZE)) != 0 &&
 	    data->physical_size == (uoff_t)-1 &&
 	    IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE))
-		fields |= MAIL_FETCH_PHYSICAL_SIZE;
+		fields |= MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE;
 	if ((data->wanted_fields & MAIL_FETCH_GUID) != 0 &&
 	    data->guid == NULL && mbox->guid_fetch_field_name != NULL)
 		fields |= MAIL_FETCH_GUID;
@@ -343,10 +344,10 @@
 			return FALSE;
 		fields &= ~MAIL_FETCH_RECEIVED_DATE;
 	}
-	if ((fields & MAIL_FETCH_PHYSICAL_SIZE) != 0) {
+	if ((fields & (MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE)) != 0) {
 		if (imail->imail.data.physical_size == (uoff_t)-1)
 			return FALSE;
-		fields &= ~MAIL_FETCH_PHYSICAL_SIZE;
+		fields &= ~(MAIL_FETCH_PHYSICAL_SIZE | MAIL_FETCH_VIRTUAL_SIZE);
 	}
 	if ((fields & MAIL_FETCH_GUID) != 0) {
 		if (imail->imail.data.guid == NULL)
diff -r 8f20aa806bcc -r d350a23207c2 src/lib-storage/index/imapc/imapc-mail.c
--- a/src/lib-storage/index/imapc/imapc-mail.c	Mon May 04 18:15:00 2015 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Mon May 04 18:31:27 2015 +0300
@@ -125,12 +125,11 @@
 	uoff_t old_offset;
 	int ret;
 
-	if (data->physical_size == (uoff_t)-1) {
+	if (data->physical_size == (uoff_t)-1)
 		(void)index_mail_get_physical_size(_mail, size_r);
-		if (data->physical_size != (uoff_t)-1) {
-			*size_r = data->physical_size;
-			return 0;
-		}
+	if (data->physical_size != (uoff_t)-1) {
+		*size_r = data->physical_size;
+		return 0;
 	}
 
 	if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE) &&
@@ -164,6 +163,17 @@
 	return 0;
 }
 
+static int imapc_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+	struct index_mail_data *data = &mail->data;
+
+	if (imapc_mail_get_physical_size(_mail, size_r) < 0)
+		return -1;
+	data->virtual_size = data->physical_size;
+	return 0;
+}
+
 static int
 imapc_mail_get_header_stream(struct mail *_mail,
 			     struct mailbox_header_lookup_ctx *headers,
@@ -302,7 +312,8 @@
 			data->save_date = data->received_date;
 		}
 	}
-	if ((data->wanted_fields & MAIL_FETCH_PHYSICAL_SIZE) != 0) {
+	if ((data->wanted_fields & (MAIL_FETCH_PHYSICAL_SIZE |
+				    MAIL_FETCH_VIRTUAL_SIZE)) != 0) {
 		if (index_mail_get_physical_size(_mail, &size) < 0 &&
 		    !IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_RFC822_SIZE))
 			data->access_part |= READ_HDR | READ_BODY;
@@ -532,7 +543,7 @@
 	index_mail_get_date,
 	imapc_mail_get_received_date,
 	imapc_mail_get_save_date,
-	imapc_mail_get_physical_size,
+	imapc_mail_get_virtual_size,
 	imapc_mail_get_physical_size,
 	imapc_mail_get_first_header,
 	imapc_mail_get_headers,


More information about the dovecot-cvs mailing list