dovecot-2.2: dsync: Don't start reading a mailbox until we know ...

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 15 13:32:48 EET 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/5a40e43bbe23
changeset: 15477:5a40e43bbe23
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 15 13:31:31 2012 +0200
description:
dsync: Don't start reading a mailbox until we know we actually need to sync it.

diffstat:

 src/doveadm/dsync/dsync-brain-mailbox.c |  41 +++++++++++++++++++-------------
 src/doveadm/dsync/dsync-brain-mails.c   |   2 +
 src/doveadm/dsync/dsync-brain-private.h |   1 +
 3 files changed, 27 insertions(+), 17 deletions(-)

diffs (129 lines):

diff -r fdf755b505c3 -r 5a40e43bbe23 src/doveadm/dsync/dsync-brain-mailbox.c
--- a/src/doveadm/dsync/dsync-brain-mailbox.c	Sat Dec 15 13:30:02 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-mailbox.c	Sat Dec 15 13:31:31 2012 +0200
@@ -100,16 +100,13 @@
 	}
 }
 
-static int
+static void
 dsync_brain_sync_mailbox_init(struct dsync_brain *brain,
 			      struct mailbox *box,
 			      const struct dsync_mailbox *local_dsync_box,
 			      bool wait_for_remote_box)
 {
-	enum dsync_mailbox_exporter_flags exporter_flags = 0;
 	const struct dsync_mailbox_state *state;
-	uint32_t last_common_uid, highest_wanted_uid;
-	uint64_t last_common_modseq;
 
 	i_assert(brain->box_importer == NULL);
 	i_assert(brain->box_exporter == NULL);
@@ -127,28 +124,36 @@
 	memset(&brain->remote_dsync_box, 0, sizeof(brain->remote_dsync_box));
 
 	state = dsync_mailbox_state_find(brain, local_dsync_box->mailbox_guid);
-	if (state != NULL) {
+	if (state != NULL)
 		brain->mailbox_state = *state;
-		last_common_uid = state->last_common_uid;
-		last_common_modseq = state->last_common_modseq;
-	} else {
+	else {
 		memset(&brain->mailbox_state, 0, sizeof(brain->mailbox_state));
 		memcpy(brain->mailbox_state.mailbox_guid,
 		       local_dsync_box->mailbox_guid,
 		       sizeof(brain->mailbox_state.mailbox_guid));
 		brain->mailbox_state.last_uidvalidity =
 			local_dsync_box->uid_validity;
-		last_common_uid = 0;
-		last_common_modseq = 0;
 	}
+}
 
+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;
+
+	i_assert(brain->log_scan == NULL);
+
+	last_common_uid = brain->mailbox_state.last_common_uid;
+	last_common_modseq = brain->mailbox_state.last_common_modseq;
 	highest_wanted_uid = last_common_uid == 0 ?
 		(uint32_t)-1 : last_common_uid;
-	if (dsync_transaction_log_scan_init(box->view, highest_wanted_uid,
+	if (dsync_transaction_log_scan_init(brain->box->view,
+					    highest_wanted_uid,
 					    last_common_modseq,
 					    &brain->log_scan) < 0) {
 		i_error("Failed to read transaction log for mailbox %s",
-			mailbox_get_vname(box));
+			mailbox_get_vname(brain->box));
 		brain->failed = TRUE;
 		return -1;
 	}
@@ -159,8 +164,9 @@
 		exporter_flags |= DSYNC_MAILBOX_EXPORTER_FLAG_MAILS_HAVE_GUIDS;
 
 	brain->box_exporter = brain->backup_recv ? NULL :
-		dsync_mailbox_export_init(box, brain->log_scan, last_common_uid,
-					  last_common_modseq, exporter_flags);
+		dsync_mailbox_export_init(brain->box, brain->log_scan,
+					  last_common_uid, last_common_modseq,
+					  exporter_flags);
 	return 0;
 }
 
@@ -173,6 +179,7 @@
 	uint64_t last_common_modseq;
 
 	i_assert(brain->box_importer == NULL);
+	i_assert(brain->log_scan != NULL);
 
 	i_assert(memcmp(brain->local_dsync_box.mailbox_guid,
 			remote_dsync_box->mailbox_guid,
@@ -391,7 +398,7 @@
 
 	/* start exporting this mailbox (wait for remote to start importing) */
 	dsync_ibc_send_mailbox(brain->ibc, &dsync_box);
-	(void)dsync_brain_sync_mailbox_init(brain, box, &dsync_box, TRUE);
+	dsync_brain_sync_mailbox_init(brain, box, &dsync_box, TRUE);
 	brain->state = DSYNC_STATE_SYNC_MAILS;
 }
 
@@ -606,8 +613,8 @@
 	}
 
 	/* start export/import */
-	if (dsync_brain_sync_mailbox_init(brain, box, &local_dsync_box,
-					  FALSE) == 0)
+	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);
 
 	brain->state = DSYNC_STATE_SYNC_MAILS;
diff -r fdf755b505c3 -r 5a40e43bbe23 src/doveadm/dsync/dsync-brain-mails.c
--- a/src/doveadm/dsync/dsync-brain-mails.c	Sat Dec 15 13:30:02 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-mails.c	Sat Dec 15 13:31:31 2012 +0200
@@ -53,6 +53,8 @@
 		dsync_brain_sync_mailbox_deinit(brain);
 		return TRUE;
 	}
+	if (dsync_brain_sync_mailbox_open(brain) < 0)
+		return TRUE;
 	dsync_brain_sync_mailbox_init_remote(brain, dsync_box);
 	dsync_brain_sync_init_box_states(brain);
 	return TRUE;
diff -r fdf755b505c3 -r 5a40e43bbe23 src/doveadm/dsync/dsync-brain-private.h
--- a/src/doveadm/dsync/dsync-brain-private.h	Sat Dec 15 13:30:02 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-private.h	Sat Dec 15 13:31:31 2012 +0200
@@ -108,6 +108,7 @@
 
 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);
 bool dsync_brain_sync_mails(struct dsync_brain *brain);


More information about the dovecot-cvs mailing list