changeset 22948:e48f732f0f39

mdbox: Assume that empty uid maps found during sync are harmless Instead of failing the sync and causing index rebuild, just skip over the empty uid maps. Chances are that they these records came from various plugins that create fake mails.
author Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
date Mon, 23 Apr 2018 18:15:51 -0400
parents d5b44ec763b0
children ca4a2b85b6f6
files src/lib-storage/index/dbox-multi/mdbox-sync.c
diffstat 1 files changed, 14 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-sync.c	Tue Dec 12 21:36:07 2017 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-sync.c	Mon Apr 23 18:15:51 2018 -0400
@@ -23,6 +23,7 @@
 #include "mdbox-sync.h"
 
 
+/* returns -1 on error, 1 on success, 0 if guid is empty/missing */
 static int
 dbox_sync_verify_expunge_guid(struct mdbox_sync_context *ctx, uint32_t seq,
 			      const guid_128_t guid_128)
@@ -33,9 +34,13 @@
 	mail_index_lookup_uid(ctx->sync_view, seq, &uid);
 	mail_index_lookup_ext(ctx->sync_view, seq,
 			      ctx->mbox->guid_ext_id, &data, NULL);
+
+	if ((data == NULL) || guid_128_is_empty(data))
+		return 0;
+
 	if (guid_128_is_empty(guid_128) ||
 	    memcmp(data, guid_128, GUID_128_SIZE) == 0)
-		return 0;
+		return 1;
 
 	mail_storage_set_critical(&ctx->mbox->storage->storage.storage,
 		"Mailbox %s: Expunged GUID mismatch for UID %u: %s vs %s",
@@ -49,14 +54,16 @@
 			      const guid_128_t guid_128)
 {
 	uint32_t map_uid;
+	int ret;
 
 	if (seq_range_array_add(&ctx->expunged_seqs, seq)) {
 		/* already marked as expunged in this sync */
 		return 0;
 	}
 
-	if (dbox_sync_verify_expunge_guid(ctx, seq, guid_128) < 0)
-		return -1;
+	ret = dbox_sync_verify_expunge_guid(ctx, seq, guid_128);
+	if (ret <= 0)
+		return ret;
 	if (mdbox_mail_lookup(ctx->mbox, ctx->sync_view, seq, &map_uid) < 0)
 		return -1;
 	if (mdbox_map_update_refcount(ctx->map_trans, map_uid, -1) < 0)
@@ -107,7 +114,10 @@
 		mail_index_lookup_uid(ctx->sync_view, seq, &uid);
 		mail_index_lookup_ext(ctx->sync_view, seq,
 				      ctx->mbox->guid_ext_id, &data, NULL);
-		mail_index_expunge_guid(trans, seq, data);
+		if ((data == NULL) || guid_128_is_empty(data))
+			mail_index_expunge(trans, seq);
+		else
+			mail_index_expunge_guid(trans, seq, data);
 	}
 	if (mail_index_transaction_commit(&trans) < 0)
 		return -1;