dovecot-2.2: dsync: Error handling fix when mailbox is unexpecte...

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 15 13:01:29 EET 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/01ba0511d04d
changeset: 15470:01ba0511d04d
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 15 12:31:56 2012 +0200
description:
dsync: Error handling fix when mailbox is unexpectedly lost.

diffstat:

 src/doveadm/dsync/dsync-brain-mailbox.c |  25 ++++++++++++++++++-------
 src/doveadm/dsync/dsync-ibc-stream.c    |   2 +-
 2 files changed, 19 insertions(+), 8 deletions(-)

diffs (65 lines):

diff -r 05d83c4df130 -r 01ba0511d04d src/doveadm/dsync/dsync-brain-mailbox.c
--- a/src/doveadm/dsync/dsync-brain-mailbox.c	Fri Dec 14 15:34:56 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-mailbox.c	Sat Dec 15 12:31:56 2012 +0200
@@ -530,10 +530,24 @@
 	}
 }
 
+static void
+dsync_brain_slave_send_mailbox_lost(struct dsync_brain *brain,
+				    const struct dsync_mailbox *dsync_box)
+{
+	struct dsync_mailbox delete_box;
+
+	memset(&delete_box, 0, sizeof(delete_box));
+	memcpy(delete_box.mailbox_guid, dsync_box->mailbox_guid,
+	       sizeof(delete_box.mailbox_guid));
+	t_array_init(&delete_box.cache_fields, 0);
+	delete_box.mailbox_lost = TRUE;
+	dsync_ibc_send_mailbox(brain->ibc, &delete_box);
+}
+
 bool dsync_brain_slave_recv_mailbox(struct dsync_brain *brain)
 {
 	const struct dsync_mailbox *dsync_box;
-	struct dsync_mailbox local_dsync_box, delete_box;
+	struct dsync_mailbox local_dsync_box;
 	struct mailbox *box;
 	int ret;
 
@@ -553,8 +567,9 @@
 	}
 	if (box == NULL) {
 		/* mailbox was probably deleted/renamed during sync */
-		//FIXME: in case it wasn't, do error handling
+		//FIXME: verify this from log, and if not log an error.
 		brain->changes_during_sync = TRUE;
+		dsync_brain_slave_send_mailbox_lost(brain, dsync_box);
 		return TRUE;
 	}
 	if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
@@ -573,11 +588,7 @@
 			return TRUE;
 		}
 		/* another process just deleted this mailbox? */
-		memset(&delete_box, 0, sizeof(delete_box));
-		memcpy(delete_box.mailbox_guid, dsync_box->mailbox_guid,
-		       sizeof(delete_box.mailbox_guid));
-		delete_box.mailbox_lost = TRUE;
-		dsync_ibc_send_mailbox(brain->ibc, &delete_box);
+		dsync_brain_slave_send_mailbox_lost(brain, dsync_box);
 		return TRUE;
 	}
 	i_assert(local_dsync_box.uid_validity != 0);
diff -r 05d83c4df130 -r 01ba0511d04d src/doveadm/dsync/dsync-ibc-stream.c
--- a/src/doveadm/dsync/dsync-ibc-stream.c	Fri Dec 14 15:34:56 2012 +0200
+++ b/src/doveadm/dsync/dsync-ibc-stream.c	Sat Dec 15 12:31:56 2012 +0200
@@ -81,7 +81,7 @@
 	},
 	{ .name = "mailbox",
 	  .chr = 'B',
-	  .required_keys = "mailbox_guid uid_validity uid_next "
+	  .required_keys = "mailbox_lost mailbox_guid uid_validity uid_next "
 		"messages_count first_recent_uid highest_modseq",
 	  .optional_keys = "cache_fields"
 	},


More information about the dovecot-cvs mailing list