From d4aec67125c53369dab07211d7f2e2e4c71818c1 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 29 Jul 2016 00:37:07 +0300 Subject: [PATCH] lib-index: Added mail_cache_get_missing_reason() --- src/lib-index/mail-cache-lookup.c | 42 +++++++++++++++++++++++++++++++ src/lib-index/mail-cache.h | 6 +++++ 2 files changed, 48 insertions(+) diff --git a/src/lib-index/mail-cache-lookup.c b/src/lib-index/mail-cache-lookup.c index 0dbf1cb5f8..f3e875123c 100644 --- a/src/lib-index/mail-cache-lookup.c +++ b/src/lib-index/mail-cache-lookup.c @@ -609,3 +609,45 @@ int mail_cache_lookup_headers(struct mail_cache_view *view, string_t *dest, } 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); +} diff --git a/src/lib-index/mail-cache.h b/src/lib-index/mail-cache.h index d6771768d1..2cc7989346 100644 --- a/src/lib-index/mail-cache.h +++ b/src/lib-index/mail-cache.h @@ -137,4 +137,10 @@ void mail_cache_set_corrupted(struct mail_cache *cache, const char *fmt, ...) /* 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