]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add more specific mail:* reason_codes in when prefetching
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 19 Apr 2021 18:38:35 +0000 (21:38 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 29 Sep 2021 10:09:58 +0000 (10:09 +0000)
Added:
 * mail:attachment_keywords
 * mail:date
 * mail:snippet
 * mail:mime_parts
 * mail:imap_envelope
 * mail:imap_bodystructure

src/lib-storage/index/index-mail.c
src/lib-storage/index/index-mail.h

index 5e3955648be396cbd0675cdcb76e7d5a73f18aed..afa9f4de20e118a9c1a457e1b74b339db31d0a55 100644 (file)
@@ -1371,8 +1371,10 @@ int index_mail_init_stream(struct index_mail *mail,
 
        bool want_attachment_kw =
                index_mail_want_attachment_keywords_on_fetch(mail);
-       if (want_attachment_kw)
+       if (want_attachment_kw) {
                data->access_part |= PARSE_HDR | PARSE_BODY;
+               data->access_reason_code = "mail:attachment_keywords";
+       }
 
        if (hdr_size != NULL || body_size != NULL)
                (void)get_cached_msgpart_sizes(mail);
@@ -1930,8 +1932,10 @@ static void check_envelope(struct index_mail *mail)
                                                     "hdr.message-id");
        if (cache_field_hdr == UINT_MAX ||
            mail_cache_field_exists(_mail->transaction->cache_view,
-                                   _mail->seq, cache_field_hdr) <= 0)
+                                   _mail->seq, cache_field_hdr) <= 0) {
+               mail->data.access_reason_code = "mail:imap_envelope";
                mail->data.access_part |= PARSE_HDR;
+       }
        mail->data.save_envelope = TRUE;
 }
 
@@ -1978,6 +1982,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail)
 
                if (mail_cache_field_exists(cache_view, _mail->seq,
                                            cache_field) <= 0) {
+                       data->access_reason_code = "mail:mime_parts";
                        data->access_part |= PARSE_HDR | PARSE_BODY;
                        data->save_message_parts = TRUE;
                }
@@ -2002,6 +2007,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail)
                                            cache_field1) <= 0 &&
                    mail_cache_field_exists(cache_view, _mail->seq,
                                            cache_field2) <= 0) {
+                       data->access_reason_code = "mail:imap_bodystructure";
                        data->access_part |= PARSE_HDR | PARSE_BODY;
                        data->save_bodystructure_header = TRUE;
                        data->save_bodystructure_body = TRUE;
@@ -2017,6 +2023,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail)
 
                 if (mail_cache_field_exists(cache_view, _mail->seq,
                                             cache_field) <= 0) {
+                       data->access_reason_code = "mail:imap_bodystructure";
                        data->access_part |= PARSE_HDR | PARSE_BODY;
                        data->save_bodystructure_header = TRUE;
                        data->save_bodystructure_body = TRUE;
@@ -2031,6 +2038,7 @@ void index_mail_update_access_parts_pre(struct mail *_mail)
 
                if (mail_cache_field_exists(cache_view, _mail->seq,
                                            cache_field) <= 0) {
+                       data->access_reason_code = "mail:date";
                        data->access_part |= PARSE_HDR;
                        data->save_sent_date = TRUE;
                }
@@ -2042,12 +2050,17 @@ void index_mail_update_access_parts_pre(struct mail *_mail)
 
                if (mail_cache_field_exists(cache_view, _mail->seq,
                                            cache_field) <= 0) {
+                       data->access_reason_code = "mail:snippet";
                        data->access_part |= PARSE_HDR | PARSE_BODY;
                        data->save_body_snippet = TRUE;
                }
        }
        if ((data->wanted_fields & (MAIL_FETCH_STREAM_HEADER |
                                    MAIL_FETCH_STREAM_BODY)) != 0) {
+               /* Clear reason_code if set. The mail is going to be read
+                  in any case, so the previous reason for deciding to open
+                  the mail won't matter. */
+               data->access_reason_code = NULL;
                if ((data->wanted_fields & MAIL_FETCH_STREAM_HEADER) != 0)
                        data->access_part |= READ_HDR;
                if ((data->wanted_fields & MAIL_FETCH_STREAM_BODY) != 0)
@@ -2603,7 +2616,14 @@ void index_mail_set_cache_corrupted(struct mail *mail,
 int index_mail_opened(struct mail *mail,
                      struct istream **stream ATTR_UNUSED)
 {
+       struct index_mail *imail =
+               container_of(mail, struct index_mail, mail.mail);
+       struct event_reason *reason = NULL;
+
+       if (imail->data.access_reason_code != NULL)
+               reason = event_reason_begin(imail->data.access_reason_code);
        mail_opened_event(mail);
+       event_reason_end(&reason);
        return 0;
 }
 
index 6e1b7da7faaa9685c40b409e6045d26c4698efbc..d0137da5e3c6f80246be4c3d9e331f2a11cd0238 100644 (file)
@@ -91,6 +91,7 @@ struct index_mail_data {
        uint32_t cache_flags;
        uint64_t modseq, pvt_modseq;
        enum index_mail_access_part access_part;
+       const char *access_reason_code;
        /* dont_cache_fields overrides cache_fields */
        enum mail_fetch_field cache_fetch_fields, dont_cache_fetch_fields;
        unsigned int dont_cache_field_idx;