dovecot-2.2: dsync: Added -1 parameter to do a "one way sync" wi...

dovecot at dovecot.org dovecot at dovecot.org
Wed Jun 26 20:53:07 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/0144704e1b99
changeset: 16561:0144704e1b99
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Jun 26 20:53:01 2013 +0300
description:
dsync: Added -1 parameter to do a "one way sync" without reverting changes.
This can be useful during migration when you don't want to delete any mails,
but you also don't want to send changes to the old server either.

diffstat:

 src/doveadm/dsync/doveadm-dsync.c                 |  15 ++++++++++-----
 src/doveadm/dsync/dsync-brain-mailbox-tree-sync.c |   5 ++++-
 src/doveadm/dsync/dsync-brain-mailbox-tree.c      |   4 +++-
 src/doveadm/dsync/dsync-brain-mailbox.c           |   2 +-
 src/doveadm/dsync/dsync-brain-private.h           |   1 +
 src/doveadm/dsync/dsync-brain.c                   |   2 ++
 src/doveadm/dsync/dsync-brain.h                   |   6 +++++-
 src/doveadm/dsync/dsync-ibc-stream.c              |   6 +++++-
 8 files changed, 31 insertions(+), 10 deletions(-)

diffs (173 lines):

diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/doveadm-dsync.c	Wed Jun 26 20:53:01 2013 +0300
@@ -36,7 +36,7 @@
 #include <ctype.h>
 #include <sys/wait.h>
 
-#define DSYNC_COMMON_GETOPT_ARGS "+dEfg:l:m:n:Nr:Rs:Ux:"
+#define DSYNC_COMMON_GETOPT_ARGS "+1dEfg:l:m:n:Nr:Rs:Ux:"
 #define DSYNC_REMOTE_CMD_EXIT_WAIT_SECS 30
 /* The broken_char is mainly set to get a proper error message when trying to
    convert a mailbox with a name that can't be used properly translated between
@@ -80,6 +80,7 @@
 	unsigned int lock:1;
 	unsigned int sync_visible_namespaces:1;
 	unsigned int default_replica_location:1;
+	unsigned int oneway:1;
 	unsigned int backup:1;
 	unsigned int reverse_backup:1;
 	unsigned int remote_user_prefix:1;
@@ -553,6 +554,8 @@
 
 	if (ctx->no_mail_sync)
 		brain_flags |= DSYNC_BRAIN_FLAG_NO_MAIL_SYNC;
+	if (ctx->oneway)
+		brain_flags |= DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE;
 	if (doveadm_debug)
 		brain_flags |= DSYNC_BRAIN_FLAG_DEBUG;
 
@@ -852,6 +855,10 @@
 	const char *str;
 
 	switch (c) {
+	case '1':
+		ctx->oneway = TRUE;
+		ctx->backup = TRUE;
+		break;
 	case 'd':
 		ctx->default_replica_location = TRUE;
 		break;
@@ -894,8 +901,6 @@
 		ctx->rawlog_path = optarg;
 		break;
 	case 'R':
-		if (!ctx->backup)
-			return FALSE;
 		ctx->reverse_backup = TRUE;
 		break;
 	case 's':
@@ -1033,11 +1038,11 @@
 
 struct doveadm_mail_cmd cmd_dsync_mirror = {
 	cmd_dsync_alloc, "sync",
-	"[-dfR] [-l <secs>] [-m <mailbox>] [-n <namespace>] [-x <exclude>] [-s <state>] <dest>"
+	"[-1dfR] [-l <secs>] [-r <rawlog path>] [-m <mailbox>] [-n <namespace> | -N] [-x <exclude>] [-s <state>] <dest>"
 };
 struct doveadm_mail_cmd cmd_dsync_backup = {
 	cmd_dsync_backup_alloc, "backup",
-	"[-dfR] [-l <secs>] [-m <mailbox>] [-n <namespace>] [-x <exclude>] [-s <state>] <dest>"
+	"[-dfR] [-l <secs>] [-r <rawlog path>] [-m <mailbox>] [-n <namespace> | -N] [-x <exclude>] [-s <state>] <dest>"
 };
 struct doveadm_mail_cmd cmd_dsync_server = {
 	cmd_dsync_server_alloc, "dsync-server", &doveadm_mail_cmd_hide
diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/dsync-brain-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-brain-mailbox-tree-sync.c	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain-mailbox-tree-sync.c	Wed Jun 26 20:53:01 2013 +0300
@@ -102,7 +102,10 @@
 	enum mail_error error;
 	int ret = -1;
 
-	i_assert(!brain->backup_send);
+	if (brain->backup_send) {
+		i_assert(brain->no_backup_overwrite);
+		return 0;
+	}
 
 	switch (change->type) {
 	case DSYNC_MAILBOX_TREE_SYNC_TYPE_DELETE_BOX:
diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/dsync-brain-mailbox-tree.c
--- a/src/doveadm/dsync/dsync-brain-mailbox-tree.c	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain-mailbox-tree.c	Wed Jun 26 20:53:01 2013 +0300
@@ -269,7 +269,9 @@
 	const struct dsync_mailbox_tree_sync_change *change;
 	enum dsync_mailbox_trees_sync_type sync_type;
 
-	if (brain->backup_send)
+	if (brain->no_backup_overwrite)
+		sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY;
+	else if (brain->backup_send)
 		sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL;
 	else if (brain->backup_recv)
 		sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE;
diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/dsync-brain-mailbox.c
--- a/src/doveadm/dsync/dsync-brain-mailbox.c	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain-mailbox.c	Wed Jun 26 20:53:01 2013 +0300
@@ -171,7 +171,7 @@
 		import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_WANT_MAIL_REQUESTS;
 	if (brain->master_brain)
 		import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_MASTER_BRAIN;
-	if (brain->backup_recv)
+	if (brain->backup_recv && !brain->no_backup_overwrite)
 		import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_REVERT_LOCAL_CHANGES;
 	if (brain->debug)
 		import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_DEBUG;
diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/dsync-brain-private.h
--- a/src/doveadm/dsync/dsync-brain-private.h	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain-private.h	Wed Jun 26 20:53:01 2013 +0300
@@ -95,6 +95,7 @@
 	unsigned int debug:1;
 	unsigned int sync_visible_namespaces:1;
 	unsigned int no_mail_sync:1;
+	unsigned int no_backup_overwrite:1;
 	unsigned int changes_during_sync:1;
 	unsigned int verbose_proctitle:1;
 	unsigned int failed:1;
diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/dsync-brain.c
--- a/src/doveadm/dsync/dsync-brain.c	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain.c	Wed Jun 26 20:53:01 2013 +0300
@@ -130,6 +130,8 @@
 	brain->sync_visible_namespaces =
 		(flags & DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES) != 0;
 	brain->no_mail_sync = (flags & DSYNC_BRAIN_FLAG_NO_MAIL_SYNC) != 0;
+	brain->no_backup_overwrite =
+		(flags & DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE) != 0;
 }
 
 struct dsync_brain *
diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/dsync-brain.h
--- a/src/doveadm/dsync/dsync-brain.h	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain.h	Wed Jun 26 20:53:01 2013 +0300
@@ -15,7 +15,11 @@
 	DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES= 0x10,
 	/* Sync everything but the actual mails (e.g. mailbox creates,
 	   deletes) */
-	DSYNC_BRAIN_FLAG_NO_MAIL_SYNC		= 0x20
+	DSYNC_BRAIN_FLAG_NO_MAIL_SYNC		= 0x20,
+	/* Used with BACKUP_SEND/RECV: Don't force the
+	   Use the two-way syncing algorithm, but don't actually modify
+	   anything locally. (Useful during migration.) */
+	DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE	= 0x40
 };
 
 enum dsync_brain_sync_type {
diff -r 2e6829462405 -r 0144704e1b99 src/doveadm/dsync/dsync-ibc-stream.c
--- a/src/doveadm/dsync/dsync-ibc-stream.c	Wed Jun 26 20:03:26 2013 +0300
+++ b/src/doveadm/dsync/dsync-ibc-stream.c	Wed Jun 26 20:53:01 2013 +0300
@@ -75,7 +75,7 @@
 	  .optional_keys = "sync_ns_prefix sync_box sync_box_guid sync_type "
 	  	"debug sync_visible_namespaces exclude_mailboxes "
 	  	"send_mail_requests backup_send backup_recv lock_timeout"
-	  	"no_mail_sync"
+	  	"no_mail_sync no_backup_overwrite"
 	},
 	{ .name = "mailbox_state",
 	  .chr = 'S',
@@ -644,6 +644,8 @@
 		dsync_serializer_encode_add(encoder, "sync_visible_namespaces", "");
 	if ((set->brain_flags & DSYNC_BRAIN_FLAG_NO_MAIL_SYNC) != 0)
 		dsync_serializer_encode_add(encoder, "no_mail_sync", "");
+	if ((set->brain_flags & DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE) != 0)
+		dsync_serializer_encode_add(encoder, "no_backup_overwrite", "");
 
 	dsync_serializer_encode_finish(&encoder, str);
 	dsync_ibc_stream_send_string(ibc, str);
@@ -727,6 +729,8 @@
 		set->brain_flags |= DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES;
 	if (dsync_deserializer_decode_try(decoder, "no_mail_sync", &value))
 		set->brain_flags |= DSYNC_BRAIN_FLAG_NO_MAIL_SYNC;
+	if (dsync_deserializer_decode_try(decoder, "no_backup_overwrite", &value))
+		set->brain_flags |= DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE;
 
 	*set_r = set;
 	return DSYNC_IBC_RECV_RET_OK;


More information about the dovecot-cvs mailing list