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