Mercurial > dovecot > core-2.2
changeset 20559:ad24699d4138
lib-index: Added mail_cache_get_missing_reason()
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Fri, 29 Jul 2016 00:37:07 +0300 |
parents | df08a7bc2b0d |
children | 3a71ed48cdf7 |
files | src/lib-index/mail-cache-lookup.c src/lib-index/mail-cache.h |
diffstat | 2 files changed, 48 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-lookup.c Mon Jul 25 14:16:39 2016 -0400 +++ b/src/lib-index/mail-cache-lookup.c Fri Jul 29 00:37:07 2016 +0300 @@ -609,3 +609,45 @@ } T_END; return ret; } + +const char * +mail_cache_get_missing_reason(struct mail_cache_view *view, uint32_t seq) +{ + uint32_t offset, reset_id; + + if (MAIL_CACHE_IS_UNUSABLE(view->cache)) + return "Cache file is unusable"; + + offset = mail_cache_lookup_cur_offset(view->view, seq, &reset_id); + if (offset != 0) { + if (view->cache->hdr->file_seq != reset_id) { + return t_strdup_printf( + "Index reset_id=%u doesn't match cache reset_id=%u", + reset_id, view->cache->hdr->file_seq); + } + return t_strdup_printf( + "Mail has other cached fields, reset_id=%u", reset_id); + } + + /* find the newest mail that has anything in cache */ + for (; seq > 0; seq--) { + offset = mail_cache_lookup_cur_offset(view->view, seq, &reset_id); + if (offset != 0) + break; + } + if (seq == 0) + return t_strdup_printf("Cache file is empty, reset_id=%u", reset_id); + + uint32_t uid; + mail_index_lookup_uid(view->view, seq, &uid); + + if (view->cache->hdr->file_seq != reset_id) { + return t_strdup_printf( + "Mail not cached, highest cached seq=%u uid=%u: " + "Index reset_id=%u doesn't match cache reset_id=%u", + seq, uid, reset_id, view->cache->hdr->file_seq); + } + return t_strdup_printf( + "Mail not cached, highest cached seq=%u uid=%u: reset_id=%u", + seq, uid, reset_id); +}
--- a/src/lib-index/mail-cache.h Mon Jul 25 14:16:39 2016 -0400 +++ b/src/lib-index/mail-cache.h Fri Jul 29 00:37:07 2016 +0300 @@ -137,4 +137,10 @@ /* Delete the cache file. */ void mail_cache_reset(struct mail_cache *cache); +/* Returns human-readable reason for why a cached field is missing for + the specified mail. This is mainly for debugging purposes, so the exact + field doesn't matter here. */ +const char * +mail_cache_get_missing_reason(struct mail_cache_view *view, uint32_t seq); + #endif