]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add mail.mail_stream_opened and .mail_metadata_accessed
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 17 Feb 2017 14:20:06 +0000 (16:20 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 19 Feb 2017 20:06:18 +0000 (22:06 +0200)
These allow determining after mail_*() calls how efficiently they were
performed.

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

index 48ae1993debd5f559fa313c28aaed3f5dabfc97d..1b3c3ecfa0d2c2373a3e1a063cc6fb326a4eb603 100644 (file)
@@ -25,6 +25,7 @@ static int cydir_mail_stat(struct mail *mail, struct stat *st_r)
                mail_set_aborted(mail);
                return -1;
        }
+       mail->mail_metadata_accessed = TRUE;
 
        mail->transaction->stats.stat_lookup_count++;
        path = cydir_mail_get_path(mail);
index 3e760e45062e76426f97ebe35db02e52f6345725..c36cc7d8dd7c2753727d0d1e946ec296df7b58ea 100644 (file)
@@ -106,6 +106,7 @@ int mdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r,
                mail_set_aborted(_mail);
                return -1;
        }
+       _mail->mail_stream_opened = TRUE;
 
        do {
                if (mail->open_file != NULL) {
index 01b895cdf8e742ff01f60a24e9b001d06ac77dc4..f68f76effe8fd633f665ab979933a49ce6e4f4c0 100644 (file)
@@ -115,6 +115,7 @@ int sdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r,
                mail_set_aborted(_mail);
                return -1;
        }
+       _mail->mail_stream_opened = TRUE;
 
        ret = sdbox_mail_file_set(mail);
        if (ret < 0)
index 8dac8eafaa982616177fd8ca44468cb859e908c3..ebedf481bd5dbc03feab4aee7cf2fc463f57dfd5 100644 (file)
@@ -215,6 +215,7 @@ imapc_mail_send_fetch(struct mail *_mail, enum mail_fetch_field fields,
 
        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;
index 3a1b477ffbe9985e15eaf3603beb97e41a98a846..84f684bf2f3a498e1c3c3a19a3f4ffd30fe31c4a 100644 (file)
@@ -1217,6 +1217,7 @@ int index_mail_init_stream(struct index_mail *mail,
                        _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 @@ static void index_mail_reset_data(struct index_mail *mail)
        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)
index 16a514c05ad8bbb86464a08d33be6d4975d01b34..02e56027d81f88161f4bf39c63a61b294c52f441 100644 (file)
@@ -112,6 +112,7 @@ static int maildir_mail_stat(struct mail *mail, struct stat *st_r)
                mail_set_aborted(mail);
                return -1;
        }
+       mail->mail_metadata_accessed = TRUE;
 
        if (imail->data.access_part != 0 &&
            imail->data.stream == NULL) {
index 8f559789b48e87a445e9cbc7bbc0a87481ef840d..9c1cd6944792acfd5502d25866812f7cb725e0d1 100644 (file)
@@ -47,6 +47,7 @@ static int mbox_mail_seek(struct index_mail *mail)
                mail_set_aborted(_mail);
                return -1;
        }
+       _mail->mail_stream_opened = TRUE;
 
        if (mbox->mbox_stream != NULL &&
            istream_raw_mbox_is_corrupted(mbox->mbox_stream)) {
index 0de904c1833d559cbb8dc0441775d76b1cceecf0..f4de5ae120377ee3f70cdb3c01fc8dd0a69aac31 100644 (file)
@@ -18,6 +18,7 @@ static int raw_mail_stat(struct mail *mail)
                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) {
index d7dca071f41aa8ea151bdc715fa526937babb306..0d8f05b09ada50dc20cb64846d06501c9aa00874 100644 (file)
@@ -384,6 +384,16 @@ struct mail {
        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;
 };