dovecot-2.2: dsync: Support multiple -n parameters.

dovecot at dovecot.org dovecot at dovecot.org
Tue Mar 25 18:00:06 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/08f1c7af0ac0
changeset: 17170:08f1c7af0ac0
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Mar 25 19:59:24 2014 +0200
description:
dsync: Support multiple -n parameters.

diffstat:

 src/doveadm/dsync/doveadm-dsync.c            |  21 +++++++++--
 src/doveadm/dsync/dsync-brain-mailbox-tree.c |   5 --
 src/doveadm/dsync/dsync-brain-mailbox.c      |   6 ---
 src/doveadm/dsync/dsync-brain-private.h      |   2 +-
 src/doveadm/dsync/dsync-brain.c              |  48 ++++++++++++++++++++++-----
 src/doveadm/dsync/dsync-brain.h              |   4 +-
 src/doveadm/dsync/dsync-ibc-pipe.c           |   3 +-
 src/doveadm/dsync/dsync-ibc-stream.c         |   6 +-
 src/doveadm/dsync/dsync-ibc.h                |   4 +-
 9 files changed, 65 insertions(+), 34 deletions(-)

diffs (263 lines):

diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/doveadm-dsync.c	Tue Mar 25 19:59:24 2014 +0200
@@ -54,10 +54,11 @@
 struct dsync_cmd_context {
 	struct doveadm_mail_cmd_context ctx;
 	enum dsync_brain_sync_type sync_type;
-	const char *mailbox, *namespace_prefix;
+	const char *mailbox;
 	guid_128_t mailbox_guid;
 	const char *state_input, *rawlog_path;
 	ARRAY_TYPE(const_string) exclude_mailboxes;
+	ARRAY_TYPE(const_string) namespace_prefixes;
 
 	const char *remote_name;
 	const char *local_location;
@@ -510,6 +511,8 @@
 	struct dsync_ibc *ibc, *ibc2 = NULL;
 	struct dsync_brain *brain;
 	struct dsync_brain_settings set;
+	struct mail_namespace *ns;
+	const char *const *strp;
 	enum dsync_brain_flags brain_flags;
 	bool remote_errors_logged = FALSE;
 	bool changes_during_sync = FALSE;
@@ -526,9 +529,15 @@
 	}
 	doveadm_user_init_dsync(user);
 
-	if (ctx->namespace_prefix != NULL) {
-		set.sync_ns = mail_namespace_find(user->namespaces,
-						  ctx->namespace_prefix);
+	t_array_init(&set.sync_namespaces, array_count(&ctx->namespace_prefixes));
+	array_foreach(&ctx->namespace_prefixes, strp) {
+		ns = mail_namespace_find(user->namespaces, *strp);
+		if (ns == NULL) {
+			i_error("Namespace not found: '%s'", *strp);
+			ctx->ctx.exit_code = EX_USAGE;
+			return -1;
+		}
+		array_append(&set.sync_namespaces, &ns, 1);
 	}
 
 	if (ctx->run_type == DSYNC_RUN_TYPE_LOCAL)
@@ -903,7 +912,8 @@
 		array_append(&ctx->exclude_mailboxes, &str, 1);
 		break;
 	case 'n':
-		ctx->namespace_prefix = optarg;
+		str = optarg;
+		array_append(&ctx->namespace_prefixes, &str, 1);
 		break;
 	case 'N':
 		ctx->sync_visible_namespaces = TRUE;
@@ -948,6 +958,7 @@
 	doveadm_print_header("state", "state",
 			     DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
 	p_array_init(&ctx->exclude_mailboxes, ctx->ctx.pool, 4);
+	p_array_init(&ctx->namespace_prefixes, ctx->ctx.pool, 4);
 	return &ctx->ctx;
 }
 
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-brain-mailbox-tree.c
--- a/src/doveadm/dsync/dsync-brain-mailbox-tree.c	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-brain-mailbox-tree.c	Tue Mar 25 19:59:24 2014 +0200
@@ -17,11 +17,6 @@
 
 	i_assert(brain->hierarchy_sep == '\0');
 
-	if (brain->sync_ns != NULL) {
-		brain->hierarchy_sep = mail_namespace_get_sep(brain->sync_ns);
-		return;
-	}
-
 	for (ns = brain->user->namespaces; ns != NULL; ns = ns->next) {
 		if (!dsync_brain_want_namespace(brain, ns))
 			continue;
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-brain-mailbox.c
--- a/src/doveadm/dsync/dsync-brain-mailbox.c	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-brain-mailbox.c	Tue Mar 25 19:59:24 2014 +0200
@@ -47,12 +47,6 @@
 	int ret;
 
 	*box_r = NULL;
-	if (brain->sync_ns != NULL) {
-		ret = ns_mailbox_try_alloc(brain->sync_ns, guid, box_r, error_r);
-		if (ret < 0)
-			brain->failed = TRUE;
-		return ret;
-	}
 
 	for (ns = brain->user->namespaces; ns != NULL; ns = ns->next) {
 		if (!dsync_brain_want_namespace(brain, ns))
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-brain-private.h
--- a/src/doveadm/dsync/dsync-brain-private.h	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-brain-private.h	Tue Mar 25 19:59:24 2014 +0200
@@ -49,7 +49,7 @@
 	pool_t pool;
 	struct mail_user *user;
 	struct dsync_ibc *ibc;
-	struct mail_namespace *sync_ns;
+	ARRAY(struct mail_namespace *) sync_namespaces;
 	const char *sync_box;
 	guid_128_t sync_box_guid;
 	const char *const *exclude_mailboxes;
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-brain.c
--- a/src/doveadm/dsync/dsync-brain.c	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-brain.c	Tue Mar 25 19:59:24 2014 +0200
@@ -143,6 +143,8 @@
 {
 	struct dsync_ibc_settings ibc_set;
 	struct dsync_brain *brain;
+	struct mail_namespace *const *nsp;
+	string_t *sync_ns_str = NULL;
 	const char *error;
 
 	i_assert(sync_type != DSYNC_BRAIN_SYNC_TYPE_UNKNOWN);
@@ -152,8 +154,17 @@
 
 	brain = dsync_brain_common_init(user, ibc);
 	brain->sync_type = sync_type;
-	if (set->sync_ns != NULL)
-		brain->sync_ns = set->sync_ns;
+	if (array_count(&set->sync_namespaces) > 0) {
+		sync_ns_str = t_str_new(128);
+		p_array_init(&brain->sync_namespaces, brain->pool,
+			     array_count(&set->sync_namespaces));
+		array_foreach(&set->sync_namespaces, nsp) {
+			if (str_len(sync_ns_str) > 0)
+				str_append_c(sync_ns_str, '\n');
+			str_append(sync_ns_str, (*nsp)->prefix);
+			array_append(&brain->sync_namespaces, nsp, 1);
+		}
+	}
 	brain->sync_box = p_strdup(brain->pool, set->sync_box);
 	brain->exclude_mailboxes = set->exclude_mailboxes == NULL ? NULL :
 		p_strarray_dup(brain->pool, set->exclude_mailboxes);
@@ -175,8 +186,8 @@
 
 	memset(&ibc_set, 0, sizeof(ibc_set));
 	ibc_set.hostname = my_hostdomain();
-	ibc_set.sync_ns_prefix = set->sync_ns == NULL ? NULL :
-		set->sync_ns->prefix;
+	ibc_set.sync_ns_prefixes = sync_ns_str == NULL ?
+		NULL : str_c(sync_ns_str);
 	ibc_set.sync_box = set->sync_box;
 	ibc_set.exclude_mailboxes = set->exclude_mailboxes;
 	memcpy(ibc_set.sync_box_guid, set->sync_box_guid,
@@ -380,6 +391,8 @@
 static bool dsync_brain_slave_recv_handshake(struct dsync_brain *brain)
 {
 	const struct dsync_ibc_settings *ibc_set;
+	struct mail_namespace *ns;
+	const char *const *prefixes;
 
 	i_assert(!brain->master_brain);
 
@@ -394,9 +407,19 @@
 		}
 	}
 
-	if (ibc_set->sync_ns_prefix != NULL) {
-		brain->sync_ns = mail_namespace_find(brain->user->namespaces,
-						     ibc_set->sync_ns_prefix);
+	if (ibc_set->sync_ns_prefixes != NULL) {
+		p_array_init(&brain->sync_namespaces, brain->pool, 4);
+		prefixes = t_strsplit(ibc_set->sync_ns_prefixes, "\n");
+		for (; *prefixes != NULL; prefixes++) {
+			ns = mail_namespace_find(brain->user->namespaces,
+						 *prefixes);
+			if (ns == NULL) {
+				i_error("Namespace not found: '%s'", *prefixes);
+				brain->failed = TRUE;
+				return FALSE;
+			}
+			array_append(&brain->sync_namespaces, &ns, 1);
+		}
 	}
 	brain->sync_box = p_strdup(brain->pool, ibc_set->sync_box);
 	brain->exclude_mailboxes = ibc_set->exclude_mailboxes == NULL ? NULL :
@@ -619,8 +642,15 @@
 bool dsync_brain_want_namespace(struct dsync_brain *brain,
 				struct mail_namespace *ns)
 {
-	if (brain->sync_ns != NULL)
-		return brain->sync_ns == ns;
+	struct mail_namespace *const *nsp;
+
+	if (array_is_created(&brain->sync_namespaces)) {
+		array_foreach(&brain->sync_namespaces, nsp) {
+			if (ns == *nsp)
+				return TRUE;
+		}
+		return FALSE;
+	}
 	if (ns->alias_for != NULL) {
 		/* always skip aliases */
 		return FALSE;
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-brain.h
--- a/src/doveadm/dsync/dsync-brain.h	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-brain.h	Tue Mar 25 19:59:24 2014 +0200
@@ -38,8 +38,8 @@
 };
 
 struct dsync_brain_settings {
-	/* Sync only this namespace */
-	struct mail_namespace *sync_ns;
+	/* Sync only these namespaces */
+	ARRAY(struct mail_namespace *) sync_namespaces;
 	/* Sync only this mailbox name */
 	const char *sync_box;
 	/* Sync only this mailbox GUID */
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-ibc-pipe.c
--- a/src/doveadm/dsync/dsync-ibc-pipe.c	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-ibc-pipe.c	Tue Mar 25 19:59:24 2014 +0200
@@ -164,7 +164,8 @@
 
 	item = dsync_ibc_pipe_push_item(pipe->remote, ITEM_HANDSHAKE);
 	item->u.set = *set;
-	item->u.set.sync_ns_prefix = p_strdup(item->pool, set->sync_ns_prefix);
+	item->u.set.sync_ns_prefixes =
+		p_strdup(item->pool, set->sync_ns_prefixes);
 	item->u.set.sync_box = p_strdup(item->pool, set->sync_box);
 	item->u.set.exclude_mailboxes = set->exclude_mailboxes == NULL ? NULL :
 		p_strarray_dup(item->pool, set->exclude_mailboxes);
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-ibc-stream.c
--- a/src/doveadm/dsync/dsync-ibc-stream.c	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-ibc-stream.c	Tue Mar 25 19:59:24 2014 +0200
@@ -604,9 +604,9 @@
 	str_append_c(str, items[ITEM_HANDSHAKE].chr);
 	encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_HANDSHAKE]);
 	dsync_serializer_encode_add(encoder, "hostname", set->hostname);
-	if (set->sync_ns_prefix != NULL) {
+	if (set->sync_ns_prefixes != NULL) {
 		dsync_serializer_encode_add(encoder, "sync_ns_prefix",
-					    set->sync_ns_prefix);
+					    set->sync_ns_prefixes);
 	}
 	if (set->sync_box != NULL)
 		dsync_serializer_encode_add(encoder, "sync_box", set->sync_box);
@@ -700,7 +700,7 @@
 	ibc->name = i_strdup(set->hostname);
 
 	if (dsync_deserializer_decode_try(decoder, "sync_ns_prefix", &value))
-		set->sync_ns_prefix = p_strdup(pool, value);
+		set->sync_ns_prefixes = p_strdup(pool, value);
 	if (dsync_deserializer_decode_try(decoder, "sync_box", &value))
 		set->sync_box = p_strdup(pool, value);
 	if (dsync_deserializer_decode_try(decoder, "sync_box_guid", &value) &&
diff -r d972b95720db -r 08f1c7af0ac0 src/doveadm/dsync/dsync-ibc.h
--- a/src/doveadm/dsync/dsync-ibc.h	Mon Mar 24 19:07:03 2014 +0100
+++ b/src/doveadm/dsync/dsync-ibc.h	Tue Mar 25 19:59:24 2014 +0200
@@ -43,8 +43,8 @@
 	/* Server hostname. Used for determining which server does the
 	   locking. */
 	const char *hostname;
-	/* if non-NULL, sync only this namespace */
-	const char *sync_ns_prefix;
+	/* if non-NULL, sync only these namespaces (LF-separated) */
+	const char *sync_ns_prefixes;
 	/* if non-NULL, sync only this mailbox name */
 	const char *sync_box;
 	/* if non-empty, sync only this mailbox GUID */


More information about the dovecot-cvs mailing list