changeset 21597:47ab3e3483be

lib-storage: Add mail.mail_stream_opened and .mail_metadata_accessed These allow determining after mail_*() calls how efficiently they were performed.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 17 Feb 2017 16:20:06 +0200
parents d99ff372361f
children e76e742bfbab
files src/lib-storage/index/cydir/cydir-mail.c src/lib-storage/index/dbox-multi/mdbox-mail.c src/lib-storage/index/dbox-single/sdbox-mail.c src/lib-storage/index/imapc/imapc-mail-fetch.c src/lib-storage/index/index-mail.c src/lib-storage/index/maildir/maildir-mail.c src/lib-storage/index/mbox/mbox-mail.c src/lib-storage/index/raw/raw-mail.c src/lib-storage/mail-storage.h
diffstat 9 files changed, 20 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/cydir/cydir-mail.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/cydir/cydir-mail.c	Fri Feb 17 16:20:06 2017 +0200
@@ -25,6 +25,7 @@
 		mail_set_aborted(mail);
 		return -1;
 	}
+	mail->mail_metadata_accessed = TRUE;
 
 	mail->transaction->stats.stat_lookup_count++;
 	path = cydir_mail_get_path(mail);
--- a/src/lib-storage/index/dbox-multi/mdbox-mail.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c	Fri Feb 17 16:20:06 2017 +0200
@@ -106,6 +106,7 @@
 		mail_set_aborted(_mail);
 		return -1;
 	}
+	_mail->mail_stream_opened = TRUE;
 
 	do {
 		if (mail->open_file != NULL) {
--- a/src/lib-storage/index/dbox-single/sdbox-mail.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-mail.c	Fri Feb 17 16:20:06 2017 +0200
@@ -115,6 +115,7 @@
 		mail_set_aborted(_mail);
 		return -1;
 	}
+	_mail->mail_stream_opened = TRUE;
 
 	ret = sdbox_mail_file_set(mail);
 	if (ret < 0)
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c	Fri Feb 17 16:20:06 2017 +0200
@@ -215,6 +215,7 @@
 
 	if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER)
 		return -1;
+	_mail->mail_stream_opened = TRUE;
 
 	/* drop any fields that we may already be fetching currently */
 	fields &= ~mail->fetching_fields;
--- a/src/lib-storage/index/index-mail.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/index-mail.c	Fri Feb 17 16:20:06 2017 +0200
@@ -1217,6 +1217,7 @@
 			_mail->box->vname, _mail->uid,
 			mail->mail.get_stream_reason);
 	}
+	_mail->mail_stream_opened = TRUE;
 
 	if (!data->initialized_wrapper_stream &&
 	    _mail->transaction->stats_track) {
@@ -1635,6 +1636,8 @@
 	mail->mail.mail.has_nuls = FALSE;
 	mail->mail.mail.has_no_nuls = FALSE;
 	mail->mail.mail.saving = FALSE;
+	mail->mail.mail.mail_stream_opened = FALSE;
+	mail->mail.mail.mail_metadata_accessed = FALSE;
 }
 
 void index_mail_close(struct mail *_mail)
--- a/src/lib-storage/index/maildir/maildir-mail.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/maildir/maildir-mail.c	Fri Feb 17 16:20:06 2017 +0200
@@ -112,6 +112,7 @@
 		mail_set_aborted(mail);
 		return -1;
 	}
+	mail->mail_metadata_accessed = TRUE;
 
 	if (imail->data.access_part != 0 &&
 	    imail->data.stream == NULL) {
--- a/src/lib-storage/index/mbox/mbox-mail.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/mbox/mbox-mail.c	Fri Feb 17 16:20:06 2017 +0200
@@ -47,6 +47,7 @@
 		mail_set_aborted(_mail);
 		return -1;
 	}
+	_mail->mail_stream_opened = TRUE;
 
 	if (mbox->mbox_stream != NULL &&
 	    istream_raw_mbox_is_corrupted(mbox->mbox_stream)) {
--- a/src/lib-storage/index/raw/raw-mail.c	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/index/raw/raw-mail.c	Fri Feb 17 16:20:06 2017 +0200
@@ -18,6 +18,7 @@
 		mail_set_aborted(mail);
 		return -1;
 	}
+	mail->mail_metadata_accessed = TRUE;
 
 	mail->transaction->stats.fstat_lookup_count++;
 	if (i_stream_stat(mail->box->input, TRUE, &st) < 0) {
--- a/src/lib-storage/mail-storage.h	Fri Feb 17 16:14:39 2017 +0200
+++ b/src/lib-storage/mail-storage.h	Fri Feb 17 16:20:06 2017 +0200
@@ -384,6 +384,16 @@
 	unsigned int has_nuls:1; /* message data is known to contain NULs */
 	unsigned int has_no_nuls:1; /* -''- known to not contain NULs */
 
+	/* Mail's header/body stream was opened within this request.
+	   If lookup_abort!=MAIL_LOOKUP_ABORT_NEVER, this can't become TRUE. */
+	bool mail_stream_opened:1;
+	/* Mail's fast metadata was accessed within this request, e.g. the mail
+	   file was stat()ed. If mail_stream_opened==TRUE, this value isn't
+	   accurate anymore, because some backends may always set this when
+	   stream is opened and some don't. If lookup_abort is
+	   MAIL_LOOKUP_ABORT_NOT_IN_CACHE, this can't become TRUE. */
+	bool mail_metadata_accessed:1;
+
 	/* If the lookup is aborted, error is set to MAIL_ERROR_NOTPOSSIBLE */
 	enum mail_lookup_abort lookup_abort;
 };