# HG changeset patch # User Timo Sirainen # Date 1487341206 -7200 # Node ID 47ab3e3483be3944eafa4e3e3e4983f9e47c368e # Parent d99ff372361f10b2e0230de1cd3a00c07d74df3f lib-storage: Add mail.mail_stream_opened and .mail_metadata_accessed These allow determining after mail_*() calls how efficiently they were performed. diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/cydir/cydir-mail.c --- 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); diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/dbox-multi/mdbox-mail.c --- 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) { diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/dbox-single/sdbox-mail.c --- 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) diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/imapc/imapc-mail-fetch.c --- 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; diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/index-mail.c --- 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) diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/maildir/maildir-mail.c --- 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) { diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/mbox/mbox-mail.c --- 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)) { diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/index/raw/raw-mail.c --- 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) { diff -r d99ff372361f -r 47ab3e3483be src/lib-storage/mail-storage.h --- 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; };