From: Timo Sirainen Date: Sun, 28 Feb 2016 18:19:45 +0000 (+0200) Subject: lib-storage: Added mail_set_cache_corrupted_reason() X-Git-Tag: 2.2.22.rc1~38 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6de6ec228a41275ddda972d4a554699ea75cd06d;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added mail_set_cache_corrupted_reason() --- diff --git a/src/lib-storage/fail-mail.c b/src/lib-storage/fail-mail.c index e9f2bff6df..4a899bd94c 100644 --- a/src/lib-storage/fail-mail.c +++ b/src/lib-storage/fail-mail.c @@ -228,6 +228,13 @@ fail_mail_set_cache_corrupted(struct mail *mail ATTR_UNUSED, { } +static void +fail_mail_set_cache_corrupted_reason(struct mail *mail ATTR_UNUSED, + enum mail_fetch_field field ATTR_UNUSED, + const char *reason ATTR_UNUSED) +{ +} + struct mail_vfuncs fail_mail_vfuncs = { NULL, fail_mail_free, @@ -263,5 +270,6 @@ struct mail_vfuncs fail_mail_vfuncs = { NULL, fail_mail_expunge, fail_mail_set_cache_corrupted, - NULL + NULL, + fail_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index 4453e8c985..03f46eb672 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -165,5 +165,6 @@ struct mail_vfuncs cydir_mail_vfuncs = { NULL, index_mail_expunge, index_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + index_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/dbox-multi/mdbox-mail.c b/src/lib-storage/index/dbox-multi/mdbox-mail.c index 9584d1f77f..0b6611c221 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-mail.c +++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c @@ -261,5 +261,6 @@ struct mail_vfuncs mdbox_mail_vfuncs = { NULL, index_mail_expunge, index_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + index_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/dbox-single/sdbox-mail.c b/src/lib-storage/index/dbox-single/sdbox-mail.c index ac9fa49099..184701ddb8 100644 --- a/src/lib-storage/index/dbox-single/sdbox-mail.c +++ b/src/lib-storage/index/dbox-single/sdbox-mail.c @@ -170,5 +170,6 @@ struct mail_vfuncs sdbox_mail_vfuncs = { NULL, index_mail_expunge, index_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + index_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/imapc/imapc-mail.c b/src/lib-storage/index/imapc/imapc-mail.c index ac4d12ea4f..1923a8f66a 100644 --- a/src/lib-storage/index/imapc/imapc-mail.c +++ b/src/lib-storage/index/imapc/imapc-mail.c @@ -583,5 +583,6 @@ struct mail_vfuncs imapc_mail_vfuncs = { NULL, index_mail_expunge, index_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + index_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 6f168a175a..51435eb9f1 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -2115,6 +2115,13 @@ void index_mail_precache(struct mail *mail) void index_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field) +{ + index_mail_set_cache_corrupted_reason(mail, field, ""); +} + +void index_mail_set_cache_corrupted_reason(struct mail *mail, + enum mail_fetch_field field, + const char *reason) { struct index_mail *imail = (struct index_mail *)mail; const char *field_name; @@ -2157,9 +2164,15 @@ void index_mail_set_cache_corrupted(struct mail *mail, mail_cache_transaction_reset(mail->transaction->cache_trans); imail->data.no_caching = TRUE; imail->data.forced_no_caching = TRUE; - mail_cache_set_corrupted(mail->box->cache, - "Broken %s for mail UID %u", - field_name, mail->uid); + if (reason[0] == '\0') { + mail_cache_set_corrupted(mail->box->cache, + "Broken %s for mail UID %u", + field_name, mail->uid); + } else { + mail_cache_set_corrupted(mail->box->cache, + "Broken %s for mail UID %u: %s", + field_name, mail->uid, reason); + } } int index_mail_opened(struct mail *mail ATTR_UNUSED, diff --git a/src/lib-storage/index/index-mail.h b/src/lib-storage/index/index-mail.h index 8bef46a81b..df2c6b1858 100644 --- a/src/lib-storage/index/index-mail.h +++ b/src/lib-storage/index/index-mail.h @@ -235,6 +235,9 @@ void index_mail_expunge(struct mail *mail); void index_mail_precache(struct mail *mail); void index_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field); +void index_mail_set_cache_corrupted_reason(struct mail *mail, + enum mail_fetch_field field, + const char *reason); int index_mail_opened(struct mail *mail, struct istream **stream); int index_mail_stream_check_failure(struct index_mail *mail); void index_mail_stream_log_failure_for(struct index_mail *mail, diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 2f0293c75d..9c39127629 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -753,15 +753,22 @@ maildir_mail_remove_sizes_from_filename(struct mail *mail, (void)maildir_file_do(mbox, mail->uid, do_fix_size, &ctx); } -static void maildir_mail_set_cache_corrupted(struct mail *_mail, - enum mail_fetch_field field) +static void maildir_mail_set_cache_corrupted_reason(struct mail *_mail, + enum mail_fetch_field field, + const char *reason) { if (field == MAIL_FETCH_PHYSICAL_SIZE || field == MAIL_FETCH_VIRTUAL_SIZE) { maildir_mail_remove_sizes_from_uidlist(_mail); maildir_mail_remove_sizes_from_filename(_mail, field); } - index_mail_set_cache_corrupted(_mail, field); + index_mail_set_cache_corrupted_reason(_mail, field, reason); +} + +static void maildir_mail_set_cache_corrupted(struct mail *_mail, + enum mail_fetch_field field) +{ + maildir_mail_set_cache_corrupted_reason(_mail, field, ""); } struct mail_vfuncs maildir_mail_vfuncs = { @@ -799,5 +806,6 @@ struct mail_vfuncs maildir_mail_vfuncs = { maildir_update_pop3_uidl, index_mail_expunge, maildir_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + maildir_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/mbox/mbox-mail.c b/src/lib-storage/index/mbox/mbox-mail.c index 38487c3882..3542919429 100644 --- a/src/lib-storage/index/mbox/mbox-mail.c +++ b/src/lib-storage/index/mbox/mbox-mail.c @@ -446,5 +446,6 @@ struct mail_vfuncs mbox_mail_vfuncs = { NULL, index_mail_expunge, index_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + index_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/pop3c/pop3c-mail.c b/src/lib-storage/index/pop3c/pop3c-mail.c index 04350e5869..fe6643ee61 100644 --- a/src/lib-storage/index/pop3c/pop3c-mail.c +++ b/src/lib-storage/index/pop3c/pop3c-mail.c @@ -302,5 +302,6 @@ struct mail_vfuncs pop3c_mail_vfuncs = { NULL, index_mail_expunge, index_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + index_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/index/raw/raw-mail.c b/src/lib-storage/index/raw/raw-mail.c index 5c0b4c6da3..4cdeafdb73 100644 --- a/src/lib-storage/index/raw/raw-mail.c +++ b/src/lib-storage/index/raw/raw-mail.c @@ -149,5 +149,6 @@ struct mail_vfuncs raw_mail_vfuncs = { NULL, index_mail_expunge, index_mail_set_cache_corrupted, - index_mail_opened + index_mail_opened, + index_mail_set_cache_corrupted_reason }; diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 5583919275..d1f1a8250c 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -446,6 +446,9 @@ struct mail_vfuncs { void (*set_cache_corrupted)(struct mail *mail, enum mail_fetch_field field); int (*istream_opened)(struct mail *mail, struct istream **input); + void (*set_cache_corrupted_reason)(struct mail *mail, + enum mail_fetch_field field, + const char *reason); }; union mail_module_context { diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 6f2fe75411..4c99849e50 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -897,6 +897,9 @@ void mail_expunge(struct mail *mail); void mail_precache(struct mail *mail); /* Mark a cached field corrupted and have it recalculated. */ void mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field); +void mail_set_cache_corrupted_reason(struct mail *mail, + enum mail_fetch_field field, + const char *reason); /* Return 128 bit GUID using input string. If guid is already 128 bit hex encoded, it's returned as-is. Otherwise SHA1 sum is taken and its last diff --git a/src/lib-storage/mail.c b/src/lib-storage/mail.c index 4da8ffd5d6..4be8f73c1a 100644 --- a/src/lib-storage/mail.c +++ b/src/lib-storage/mail.c @@ -403,10 +403,23 @@ void mail_precache(struct mail *mail) } void mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field) +{ + mail_set_cache_corrupted_reason(mail, field, ""); +} + +void mail_set_cache_corrupted_reason(struct mail *mail, + enum mail_fetch_field field, + const char *reason) { struct mail_private *p = (struct mail_private *)mail; - p->v.set_cache_corrupted(mail, field); + /* FIXME: v2.3: rename set_cache_corrupted_reason() to just + set_cache_corrupted(). we have two here for backwards API + compatibility. */ + if (p->v.set_cache_corrupted_reason != NULL) + p->v.set_cache_corrupted_reason(mail, field, reason); + else + p->v.set_cache_corrupted(mail, field); } void mail_generate_guid_128_hash(const char *guid, guid_128_t guid_128_r) diff --git a/src/plugins/virtual/virtual-mail.c b/src/plugins/virtual/virtual-mail.c index f9a61be7e3..b135e8442a 100644 --- a/src/plugins/virtual/virtual-mail.c +++ b/src/plugins/virtual/virtual-mail.c @@ -468,14 +468,22 @@ static void virtual_mail_expunge(struct mail *mail) } static void -virtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field) +virtual_mail_set_cache_corrupted_reason(struct mail *mail, + enum mail_fetch_field field, + const char *reason) { struct virtual_mail *vmail = (struct virtual_mail *)mail; struct mail *backend_mail; if (backend_mail_get(vmail, &backend_mail) < 0) return; - mail_set_cache_corrupted(backend_mail, field); + mail_set_cache_corrupted_reason(backend_mail, field, reason); +} + +static void +virtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field) +{ + virtual_mail_set_cache_corrupted_reason(mail, field, ""); } struct mail_vfuncs virtual_mail_vfuncs = { @@ -513,5 +521,6 @@ struct mail_vfuncs virtual_mail_vfuncs = { virtual_mail_update_pop3_uidl, virtual_mail_expunge, virtual_mail_set_cache_corrupted, - NULL + NULL, + virtual_mail_set_cache_corrupted_reason };