Skip to content

Commit

Permalink
lib-index: Added mail_cache_get_missing_reason()
Browse files Browse the repository at this point in the history
  • Loading branch information
sirainen committed Aug 4, 2016
1 parent 8deeb07 commit d4aec67
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/lib-index/mail-cache-lookup.c
Expand Up @@ -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);
}
6 changes: 6 additions & 0 deletions src/lib-index/mail-cache.h
Expand Up @@ -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

0 comments on commit d4aec67

Please sign in to comment.