# HG changeset patch # User Timo Sirainen # Date 1469741827 -10800 # Node ID ad24699d413869767807155c8f793a6499f26f8a # Parent df08a7bc2b0d5706a6d5aeda605498aec439c59f lib-index: Added mail_cache_get_missing_reason() diff -r df08a7bc2b0d -r ad24699d4138 src/lib-index/mail-cache-lookup.c --- 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); +} diff -r df08a7bc2b0d -r ad24699d4138 src/lib-index/mail-cache.h --- 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