dovecot-2.2: dsync: Automatically figure out which mailboxes can...

dovecot at dovecot.org dovecot at dovecot.org
Mon Feb 11 00:29:48 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/5a1fc3723371
changeset: 15750:5a1fc3723371
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Feb 11 00:28:28 2013 +0200
description:
dsync: Automatically figure out which mailboxes can sync with message GUIDs.

diffstat:

 src/doveadm/dsync/doveadm-dsync.c       |   3 +-
 src/doveadm/dsync/dsync-brain-mailbox.c |  87 +++++++++++++++++---------------
 src/doveadm/dsync/dsync-brain-mails.c   |   3 +-
 src/doveadm/dsync/dsync-brain-private.h |   6 +-
 src/doveadm/dsync/dsync-brain.c         |   2 -
 src/doveadm/dsync/dsync-brain.h         |  11 +--
 src/doveadm/dsync/dsync-ibc-stream.c    |  12 ++--
 src/doveadm/dsync/dsync-mailbox.h       |   1 +
 8 files changed, 62 insertions(+), 63 deletions(-)

diffs (269 lines):

diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/doveadm-dsync.c	Mon Feb 11 00:28:28 2013 +0200
@@ -419,8 +419,7 @@
 				     remote_error_input, ctx);
 	}
 
-	brain_flags = DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS |
-		DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS;
+	brain_flags = DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS;
 	if (ctx->sync_all_namespaces)
 		brain_flags |= DSYNC_BRAIN_FLAG_SYNC_ALL_NAMESPACES;
 
diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/dsync-brain-mailbox.c
--- a/src/doveadm/dsync/dsync-brain-mailbox.c	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/dsync-brain-mailbox.c	Mon Feb 11 00:28:28 2013 +0200
@@ -136,45 +136,9 @@
 	}
 }
 
-int dsync_brain_sync_mailbox_open(struct dsync_brain *brain)
-{
-	enum dsync_mailbox_exporter_flags exporter_flags = 0;
-	uint32_t last_common_uid, highest_wanted_uid;
-	uint64_t last_common_modseq, last_common_pvt_modseq;
-
-	i_assert(brain->log_scan == NULL);
-
-	last_common_uid = brain->mailbox_state.last_common_uid;
-	last_common_modseq = brain->mailbox_state.last_common_modseq;
-	last_common_pvt_modseq = brain->mailbox_state.last_common_pvt_modseq;
-	highest_wanted_uid = last_common_uid == 0 ?
-		(uint32_t)-1 : last_common_uid;
-	if (dsync_transaction_log_scan_init(brain->box->view,
-					    brain->box->view_pvt,
-					    highest_wanted_uid,
-					    last_common_modseq,
-					    last_common_pvt_modseq,
-					    &brain->log_scan) < 0) {
-		i_error("Failed to read transaction log for mailbox %s",
-			mailbox_get_vname(brain->box));
-		brain->failed = TRUE;
-		return -1;
-	}
-
-	if (!brain->mail_requests)
-		exporter_flags |= DSYNC_MAILBOX_EXPORTER_FLAG_AUTO_EXPORT_MAILS;
-	if (brain->mails_have_guids)
-		exporter_flags |= DSYNC_MAILBOX_EXPORTER_FLAG_MAILS_HAVE_GUIDS;
-
-	brain->box_exporter = brain->backup_recv ? NULL :
-		dsync_mailbox_export_init(brain->box, brain->log_scan,
-					  last_common_uid,
-					  exporter_flags);
-	return 0;
-}
-
-void dsync_brain_sync_mailbox_init_remote(struct dsync_brain *brain,
-					  const struct dsync_mailbox *remote_dsync_box)
+static void
+dsync_brain_sync_mailbox_init_remote(struct dsync_brain *brain,
+				     const struct dsync_mailbox *remote_dsync_box)
 {
 	enum dsync_mailbox_import_flags import_flags = 0;
 	const struct dsync_mailbox_state *state;
@@ -221,6 +185,46 @@
 					  import_flags);
 }
 
+int dsync_brain_sync_mailbox_open(struct dsync_brain *brain,
+				  const struct dsync_mailbox *remote_dsync_box)
+{
+	enum dsync_mailbox_exporter_flags exporter_flags = 0;
+	uint32_t last_common_uid, highest_wanted_uid;
+	uint64_t last_common_modseq, last_common_pvt_modseq;
+
+	i_assert(brain->log_scan == NULL);
+
+	last_common_uid = brain->mailbox_state.last_common_uid;
+	last_common_modseq = brain->mailbox_state.last_common_modseq;
+	last_common_pvt_modseq = brain->mailbox_state.last_common_pvt_modseq;
+	highest_wanted_uid = last_common_uid == 0 ?
+		(uint32_t)-1 : last_common_uid;
+	if (dsync_transaction_log_scan_init(brain->box->view,
+					    brain->box->view_pvt,
+					    highest_wanted_uid,
+					    last_common_modseq,
+					    last_common_pvt_modseq,
+					    &brain->log_scan) < 0) {
+		i_error("Failed to read transaction log for mailbox %s",
+			mailbox_get_vname(brain->box));
+		brain->failed = TRUE;
+		return -1;
+	}
+
+	if (!brain->mail_requests)
+		exporter_flags |= DSYNC_MAILBOX_EXPORTER_FLAG_AUTO_EXPORT_MAILS;
+	if (brain->local_dsync_box.have_guids &&
+	    remote_dsync_box->have_guids)
+		exporter_flags |= DSYNC_MAILBOX_EXPORTER_FLAG_MAILS_HAVE_GUIDS;
+
+	brain->box_exporter = brain->backup_recv ? NULL :
+		dsync_mailbox_export_init(brain->box, brain->log_scan,
+					  last_common_uid,
+					  exporter_flags);
+	dsync_brain_sync_mailbox_init_remote(brain, remote_dsync_box);
+	return 0;
+}
+
 void dsync_brain_sync_mailbox_deinit(struct dsync_brain *brain)
 {
 	i_assert(brain->box != NULL);
@@ -294,6 +298,7 @@
 	dsync_box_r->highest_modseq = status.highest_modseq;
 	dsync_box_r->highest_pvt_modseq = status.highest_pvt_modseq;
 	dsync_box_r->cache_fields = *metadata.cache_fields;
+	dsync_box_r->have_guids = status.have_guids;
 	return 1;
 }
 
@@ -626,8 +631,8 @@
 
 	/* start export/import */
 	dsync_brain_sync_mailbox_init(brain, box, &local_dsync_box, FALSE);
-	if (dsync_brain_sync_mailbox_open(brain) == 0)
-		dsync_brain_sync_mailbox_init_remote(brain, dsync_box);
+	if (dsync_brain_sync_mailbox_open(brain, dsync_box) < 0)
+		return TRUE;
 
 	brain->state = DSYNC_STATE_SYNC_MAILS;
 	return TRUE;
diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/dsync-brain-mails.c
--- a/src/doveadm/dsync/dsync-brain-mails.c	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/dsync-brain-mails.c	Mon Feb 11 00:28:28 2013 +0200
@@ -53,9 +53,8 @@
 		dsync_brain_sync_mailbox_deinit(brain);
 		return TRUE;
 	}
-	if (dsync_brain_sync_mailbox_open(brain) < 0)
+	if (dsync_brain_sync_mailbox_open(brain, dsync_box) < 0)
 		return TRUE;
-	dsync_brain_sync_mailbox_init_remote(brain, dsync_box);
 	dsync_brain_sync_init_box_states(brain);
 	return TRUE;
 }
diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/dsync-brain-private.h
--- a/src/doveadm/dsync/dsync-brain-private.h	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/dsync-brain-private.h	Mon Feb 11 00:28:28 2013 +0200
@@ -78,7 +78,6 @@
 
 	unsigned int master_brain:1;
 	unsigned int mail_requests:1;
-	unsigned int mails_have_guids:1;
 	unsigned int backup_send:1;
 	unsigned int backup_recv:1;
 	unsigned int debug:1;
@@ -108,9 +107,8 @@
 
 void dsync_brain_master_send_mailbox(struct dsync_brain *brain);
 bool dsync_brain_slave_recv_mailbox(struct dsync_brain *brain);
-int dsync_brain_sync_mailbox_open(struct dsync_brain *brain);
-void dsync_brain_sync_mailbox_init_remote(struct dsync_brain *brain,
-					  const struct dsync_mailbox *remote_dsync_box);
+int dsync_brain_sync_mailbox_open(struct dsync_brain *brain,
+				  const struct dsync_mailbox *remote_dsync_box);
 bool dsync_brain_sync_mails(struct dsync_brain *brain);
 
 #endif
diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/dsync-brain.c
--- a/src/doveadm/dsync/dsync-brain.c	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/dsync-brain.c	Mon Feb 11 00:28:28 2013 +0200
@@ -72,8 +72,6 @@
 {
 	brain->mail_requests =
 		(flags & DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS) != 0;
-	brain->mails_have_guids =
-		(flags & DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS) != 0;
 	brain->backup_send = (flags & DSYNC_BRAIN_FLAG_BACKUP_SEND) != 0;
 	brain->backup_recv = (flags & DSYNC_BRAIN_FLAG_BACKUP_RECV) != 0;
 	brain->debug = (flags & DSYNC_BRAIN_FLAG_DEBUG) != 0;
diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/dsync-brain.h
--- a/src/doveadm/dsync/dsync-brain.h	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/dsync-brain.h	Mon Feb 11 00:28:28 2013 +0200
@@ -6,12 +6,11 @@
 struct dsync_ibc;
 
 enum dsync_brain_flags {
-	DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS	= 0x01,
-	DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS	= 0x02,
-	DSYNC_BRAIN_FLAG_BACKUP_SEND		= 0x04,
-	DSYNC_BRAIN_FLAG_BACKUP_RECV		= 0x08,
-	DSYNC_BRAIN_FLAG_DEBUG			= 0x10,
-	DSYNC_BRAIN_FLAG_SYNC_ALL_NAMESPACES	= 0x20
+	DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS	= 0x01,
+	DSYNC_BRAIN_FLAG_BACKUP_SEND		= 0x02,
+	DSYNC_BRAIN_FLAG_BACKUP_RECV		= 0x04,
+	DSYNC_BRAIN_FLAG_DEBUG			= 0x08,
+	DSYNC_BRAIN_FLAG_SYNC_ALL_NAMESPACES	= 0x10
 };
 
 enum dsync_brain_sync_type {
diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/dsync-ibc-stream.c
--- a/src/doveadm/dsync/dsync-ibc-stream.c	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/dsync-ibc-stream.c	Mon Feb 11 00:28:28 2013 +0200
@@ -61,7 +61,7 @@
 	{ .name = "handshake",
 	  .chr = 'H',
 	  .optional_keys = "sync_ns_prefix sync_box sync_type debug sync_all_namespaces "
-	  	"mails_have_guids send_mail_requests backup_send backup_recv"
+	  	"send_mail_requests backup_send backup_recv"
 	},
 	{ .name = "mailbox_state",
 	  .chr = 'S',
@@ -83,7 +83,7 @@
 	  .chr = 'B',
 	  .required_keys = "mailbox_guid uid_validity uid_next messages_count "
 		"first_recent_uid highest_modseq highest_pvt_modseq",
-	  .optional_keys = "mailbox_lost cache_fields"
+	  .optional_keys = "mailbox_lost cache_fields have_guids"
 	},
 	{ .name = "mail_change",
 	  .chr = 'C',
@@ -533,8 +533,6 @@
 	}
 	i_assert(sync_type[0] != '\0');
 	dsync_serializer_encode_add(encoder, "sync_type", sync_type);
-	if ((set->brain_flags & DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS) != 0)
-		dsync_serializer_encode_add(encoder, "mails_have_guids", "");
 	if ((set->brain_flags & DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS) != 0)
 		dsync_serializer_encode_add(encoder, "send_mail_requests", "");
 	if ((set->brain_flags & DSYNC_BRAIN_FLAG_BACKUP_SEND) != 0)
@@ -595,8 +593,6 @@
 			return DSYNC_IBC_RECV_RET_TRYAGAIN;
 		}
 	}
-	if (dsync_deserializer_decode_try(decoder, "mails_have_guids", &value))
-		set->brain_flags |= DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS;
 	if (dsync_deserializer_decode_try(decoder, "send_mail_requests", &value))
 		set->brain_flags |= DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS;
 	if (dsync_deserializer_decode_try(decoder, "backup_send", &value))
@@ -997,6 +993,8 @@
 
 	if (dsync_box->mailbox_lost)
 		dsync_serializer_encode_add(encoder, "mailbox_lost", "");
+	if (dsync_box->have_guids)
+		dsync_serializer_encode_add(encoder, "have_guids", "");
 	dsync_serializer_encode_add(encoder, "uid_validity",
 				    dec2str(dsync_box->uid_validity));
 	dsync_serializer_encode_add(encoder, "uid_next",
@@ -1095,6 +1093,8 @@
 
 	if (dsync_deserializer_decode_try(decoder, "mailbox_lost", &value))
 		box->mailbox_lost = TRUE;
+	if (dsync_deserializer_decode_try(decoder, "have_guids", &value))
+		box->have_guids = TRUE;
 	value = dsync_deserializer_decode_get(decoder, "uid_validity");
 	if (str_to_uint32(value, &box->uid_validity) < 0) {
 		dsync_ibc_input_error(ibc, decoder, "Invalid uid_validity");
diff -r 91f60f0d72df -r 5a1fc3723371 src/doveadm/dsync/dsync-mailbox.h
--- a/src/doveadm/dsync/dsync-mailbox.h	Mon Feb 11 00:26:15 2013 +0200
+++ b/src/doveadm/dsync/dsync-mailbox.h	Mon Feb 11 00:28:28 2013 +0200
@@ -8,6 +8,7 @@
 struct dsync_mailbox {
 	guid_128_t mailbox_guid;
 	bool mailbox_lost;
+	bool have_guids;
 
 	uint32_t uid_validity, uid_next, messages_count, first_recent_uid;
 	uint64_t highest_modseq, highest_pvt_modseq;


More information about the dovecot-cvs mailing list