From: Timo Sirainen Date: Fri, 17 Feb 2017 14:20:06 +0000 (+0200) Subject: lib-storage: Add mail.mail_stream_opened and .mail_metadata_accessed X-Git-Tag: 2.3.0.rc1~2061 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7204b8112e005ff81dcf628f7880ef1feed1effe;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add mail.mail_stream_opened and .mail_metadata_accessed These allow determining after mail_*() calls how efficiently they were performed. --- diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index d077c53b82..8c8f22a3fb 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -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); diff --git a/src/lib-storage/index/dbox-multi/mdbox-mail.c b/src/lib-storage/index/dbox-multi/mdbox-mail.c index 717399a120..0078637b5e 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-mail.c +++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c @@ -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) { diff --git a/src/lib-storage/index/dbox-single/sdbox-mail.c b/src/lib-storage/index/dbox-single/sdbox-mail.c index ad5316a609..68344471f2 100644 --- a/src/lib-storage/index/dbox-single/sdbox-mail.c +++ b/src/lib-storage/index/dbox-single/sdbox-mail.c @@ -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) diff --git a/src/lib-storage/index/imapc/imapc-mail-fetch.c b/src/lib-storage/index/imapc/imapc-mail-fetch.c index c6871be1b9..2cb91527f0 100644 --- a/src/lib-storage/index/imapc/imapc-mail-fetch.c +++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c @@ -214,6 +214,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; diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 4e3395e376..299f638e50 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1219,6 +1219,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) { @@ -1639,6 +1640,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) diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 94a5cf52d3..836c410768 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -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) { diff --git a/src/lib-storage/index/mbox/mbox-mail.c b/src/lib-storage/index/mbox/mbox-mail.c index d60e0ff9ad..0baa65fa14 100644 --- a/src/lib-storage/index/mbox/mbox-mail.c +++ b/src/lib-storage/index/mbox/mbox-mail.c @@ -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)) { diff --git a/src/lib-storage/index/raw/raw-mail.c b/src/lib-storage/index/raw/raw-mail.c index d179c2cae1..9f7c19054a 100644 --- a/src/lib-storage/index/raw/raw-mail.c +++ b/src/lib-storage/index/raw/raw-mail.c @@ -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) { diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 54cd37c981..514df21d20 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -383,6 +383,16 @@ struct mail { bool has_nuls:1; /* message data is known to contain NULs */ bool 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; };