changeset 22769:e6a9ff4a07d5

mdbox: Fix rebuilding when dovecot.map.index is missing map/ref extension The rebuild kept just repeatedly failing with: Error: mdbox map .../dovecot.map.index corrupted: missing map extension
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 20 Nov 2017 17:03:47 +0200
parents 15f548f4d144
children e07da7d8ef13
files src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c
diffstat 1 files changed, 11 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c	Thu Jan 04 12:44:16 2018 -0500
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c	Mon Nov 20 17:03:47 2017 +0200
@@ -331,7 +331,7 @@
 	}
 }
 
-static int rebuild_apply_map(struct mdbox_storage_rebuild_context *ctx)
+static void rebuild_apply_map(struct mdbox_storage_rebuild_context *ctx)
 {
 	struct mdbox_map *map = ctx->storage->map;
 	const struct mail_index_header *hdr;
@@ -347,8 +347,14 @@
 	hdr = mail_index_get_header(ctx->atomic->sync_view);
 	for (seq = 1; seq <= hdr->messages_count; seq++) {
 		if (mdbox_map_view_lookup_rec(map, ctx->atomic->sync_view,
-					      seq, &rec) < 0)
-			return -1;
+					      seq, &rec) < 0) {
+			/* map or ref extension is missing from the index.
+			   Just ignore the file entirely. (Don't try to
+			   continue with other records, since they'll fail
+			   as well, and each failure logs the same error.) */
+			i_assert(seq == 1);
+			break;
+		}
 
 		/* look up the rebuild msg record for this message based on
 		   the (file_id, offset, size) triplet */
@@ -373,7 +379,6 @@
 	/* afterwards we're interested in looking up map_uids.
 	   re-sort the messages to make it easier. */
 	array_sort(&ctx->msgs, mdbox_rebuild_msg_uid_cmp);
-	return 0;
 }
 
 static struct mdbox_rebuild_msg *
@@ -944,8 +949,8 @@
 			return -1;
 	}
 
-	if (rebuild_apply_map(ctx) < 0 ||
-	    rebuild_mailboxes(ctx) < 0 ||
+	rebuild_apply_map(ctx);
+	if (rebuild_mailboxes(ctx) < 0 ||
 	    rebuild_finish(ctx) < 0) {
 		mdbox_map_atomic_set_failed(ctx->atomic);
 		return -1;