dovecot-2.2: dsync: Added -P parameter to do a purge for the rem...

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 22 01:09:43 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/56be613e8ece
changeset: 16801:56be613e8ece
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Sep 22 01:09:32 2013 +0300
description:
dsync: Added -P parameter to do a purge for the remote storage after syncing.

diffstat:

 src/doveadm/dsync/doveadm-dsync.c       |  10 ++++++++--
 src/doveadm/dsync/dsync-brain-private.h |   1 +
 src/doveadm/dsync/dsync-brain.c         |  26 ++++++++++++++++++++++++++
 src/doveadm/dsync/dsync-brain.h         |   5 ++++-
 src/doveadm/dsync/dsync-ibc-stream.c    |   6 +++++-
 5 files changed, 44 insertions(+), 4 deletions(-)

diffs (176 lines):

diff -r fce84463f508 -r 56be613e8ece src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Sat Sep 21 23:33:42 2013 +0300
+++ b/src/doveadm/dsync/doveadm-dsync.c	Sun Sep 22 01:09:32 2013 +0300
@@ -36,7 +36,7 @@
 #include <ctype.h>
 #include <sys/wait.h>
 
-#define DSYNC_COMMON_GETOPT_ARGS "+1dEfg:l:m:n:Nr:Rs:Ux:"
+#define DSYNC_COMMON_GETOPT_ARGS "+1dEfg:l:m:n:NPr: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
@@ -78,6 +78,7 @@
 	unsigned int lock_timeout;
 
 	unsigned int lock:1;
+	unsigned int purge_remote:1;
 	unsigned int sync_visible_namespaces:1;
 	unsigned int default_replica_location:1;
 	unsigned int oneway:1;
@@ -364,6 +365,7 @@
 	}
 
 	brain2 = dsync_brain_slave_init(user2, ibc2, TRUE);
+	mail_user_unref(&user2);
 
 	brain1_running = brain2_running = TRUE;
 	changed1 = changed2 = TRUE;
@@ -376,7 +378,6 @@
 		brain1_running = dsync_brain_run(brain, &changed1);
 		brain2_running = dsync_brain_run(brain2, &changed2);
 	}
-	mail_user_unref(&user2);
 	*changes_during_sync_r = dsync_brain_has_unexpected_changes(brain2);
 	if (dsync_brain_deinit(&brain2) < 0) {
 		ctx->ctx.exit_code = EX_TEMPFAIL;
@@ -545,6 +546,8 @@
 	brain_flags = DSYNC_BRAIN_FLAG_SEND_MAIL_REQUESTS;
 	if (ctx->sync_visible_namespaces)
 		brain_flags |= DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES;
+	if (ctx->purge_remote)
+		brain_flags |= DSYNC_BRAIN_FLAG_PURGE_REMOTE;
 
 	if (ctx->reverse_backup)
 		brain_flags |= DSYNC_BRAIN_FLAG_BACKUP_RECV;
@@ -904,6 +907,9 @@
 	case 'N':
 		ctx->sync_visible_namespaces = TRUE;
 		break;
+	case 'P':
+		ctx->purge_remote = TRUE;
+		break;
 	case 'r':
 		ctx->rawlog_path = optarg;
 		break;
diff -r fce84463f508 -r 56be613e8ece src/doveadm/dsync/dsync-brain-private.h
--- a/src/doveadm/dsync/dsync-brain-private.h	Sat Sep 21 23:33:42 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain-private.h	Sun Sep 22 01:09:32 2013 +0300
@@ -92,6 +92,7 @@
 	unsigned int mail_requests:1;
 	unsigned int backup_send:1;
 	unsigned int backup_recv:1;
+	unsigned int purge:1;
 	unsigned int debug:1;
 	unsigned int sync_visible_namespaces:1;
 	unsigned int no_mail_sync:1;
diff -r fce84463f508 -r 56be613e8ece src/doveadm/dsync/dsync-brain.c
--- a/src/doveadm/dsync/dsync-brain.c	Sat Sep 21 23:33:42 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain.c	Sun Sep 22 01:09:32 2013 +0300
@@ -104,6 +104,7 @@
 	pool_t pool;
 
 	service_set = master_service_settings_get(master_service);
+	mail_user_ref(user);
 
 	pool = pool_alloconly_create("dsync brain", 10240);
 	brain = p_new(pool, struct dsync_brain, 1);
@@ -220,6 +221,23 @@
 	return brain;
 }
 
+static void dsync_brain_purge(struct dsync_brain *brain)
+{
+	struct mail_namespace *ns;
+	struct mail_storage *storage;
+
+	for (ns = brain->user->namespaces; ns != NULL; ns = ns->next) {
+		if (!dsync_brain_want_namespace(brain, ns))
+			continue;
+
+		storage = mail_namespace_get_default_storage(ns);
+		if (mail_storage_purge(storage) < 0) {
+			i_error("Purging namespace '%s' failed: %s", ns->prefix,
+				mail_storage_get_last_error(storage, NULL));
+		}
+	}
+}
+
 int dsync_brain_deinit(struct dsync_brain **_brain)
 {
 	struct dsync_brain *brain = *_brain;
@@ -240,6 +258,9 @@
 		brain->failed = TRUE;
 	dsync_ibc_close_mail_streams(brain->ibc);
 
+	if (brain->purge && !brain->failed)
+		dsync_brain_purge(brain);
+
 	if (brain->box != NULL)
 		dsync_brain_sync_mailbox_deinit(brain);
 	if (brain->local_tree_iter != NULL)
@@ -261,6 +282,7 @@
 	}
 
 	ret = brain->failed ? -1 : 0;
+	mail_user_unref(&brain->user);
 	pool_unref(&brain->pool);
 	return ret;
 }
@@ -383,7 +405,11 @@
 	       sizeof(brain->sync_box_guid));
 	i_assert(brain->sync_type == DSYNC_BRAIN_SYNC_TYPE_UNKNOWN);
 	brain->sync_type = ibc_set->sync_type;
+
 	dsync_brain_set_flags(brain, ibc_set->brain_flags);
+	/* this flag is only set on the remote slave brain */
+	brain->purge = (ibc_set->brain_flags &
+			DSYNC_BRAIN_FLAG_PURGE_REMOTE) != 0;
 
 	dsync_brain_mailbox_trees_init(brain);
 
diff -r fce84463f508 -r 56be613e8ece src/doveadm/dsync/dsync-brain.h
--- a/src/doveadm/dsync/dsync-brain.h	Sat Sep 21 23:33:42 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain.h	Sun Sep 22 01:09:32 2013 +0300
@@ -19,7 +19,10 @@
 	/* 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
+	DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE	= 0x40,
+	/* Run storage purge on the remote after syncing.
+	   Useful with e.g. a nightly doveadm backup. */
+	DSYNC_BRAIN_FLAG_PURGE_REMOTE		= 0x80
 };
 
 enum dsync_brain_sync_type {
diff -r fce84463f508 -r 56be613e8ece src/doveadm/dsync/dsync-ibc-stream.c
--- a/src/doveadm/dsync/dsync-ibc-stream.c	Sat Sep 21 23:33:42 2013 +0300
+++ b/src/doveadm/dsync/dsync-ibc-stream.c	Sun Sep 22 01:09:32 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_backup_overwrite"
+	  	"no_mail_sync no_backup_overwrite purge_remote"
 	},
 	{ .name = "mailbox_state",
 	  .chr = 'S',
@@ -660,6 +660,8 @@
 		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", "");
+	if ((set->brain_flags & DSYNC_BRAIN_FLAG_PURGE_REMOTE) != 0)
+		dsync_serializer_encode_add(encoder, "purge_remote", "");
 
 	dsync_serializer_encode_finish(&encoder, str);
 	dsync_ibc_stream_send_string(ibc, str);
@@ -750,6 +752,8 @@
 		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;
+	if (dsync_deserializer_decode_try(decoder, "purge_remote", &value))
+		set->brain_flags |= DSYNC_BRAIN_FLAG_PURGE_REMOTE;
 
 	*set_r = set;
 	return DSYNC_IBC_RECV_RET_OK;


More information about the dovecot-cvs mailing list