dovecot-2.2: dsync: Don't try to rename namespace prefixes.

dovecot at dovecot.org dovecot at dovecot.org
Mon Feb 9 19:58:49 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/1a0ece9b39e5
changeset: 18237:1a0ece9b39e5
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Feb 09 21:58:13 2015 +0200
description:
dsync: Don't try to rename namespace prefixes.

diffstat:

 src/doveadm/dsync/dsync-mailbox-tree-sync.c      |  19 +++++++--
 src/doveadm/dsync/test-dsync-mailbox-tree-sync.c |  46 ++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 4 deletions(-)

diffs (109 lines):

diff -r 0eb8d396949a -r 1a0ece9b39e5 src/doveadm/dsync/dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-mailbox-tree-sync.c	Mon Feb 09 21:45:04 2015 +0200
+++ b/src/doveadm/dsync/dsync-mailbox-tree-sync.c	Mon Feb 09 21:58:13 2015 +0200
@@ -759,6 +759,14 @@
 	return NULL;
 }
 
+static bool sync_node_is_namespace_root(struct dsync_mailbox_tree *tree,
+					struct dsync_mailbox_node *node)
+{
+	if (node == &tree->root)
+		return TRUE;
+	return sync_node_is_namespace_prefix(tree, node);
+}
+
 static bool sync_rename_directory(struct dsync_mailbox_tree_sync_ctx *ctx,
 				  struct dsync_mailbox_node *local_node1,
 				  struct dsync_mailbox_node *remote_node2)
@@ -766,15 +774,18 @@
 	struct dsync_mailbox_node *remote_node1, *local_node2;
 
 	/* see if we can find matching mailbox branches based on the nodes'
-	   child mailboxes (with GUIDs). */
+	   child mailboxes (with GUIDs). we can then rename the entire branch.
+	   don't try to do this for namespace prefixes though. */
 	remote_node1 = sync_find_branch(ctx->local_tree,
 					ctx->remote_tree, local_node1);
 	local_node2 = sync_find_branch(ctx->remote_tree, ctx->local_tree,
 				       remote_node2);
 	if (remote_node1 == NULL || local_node2 == NULL ||
-	    remote_node1 == &ctx->remote_tree->root ||
-	    local_node2 == &ctx->local_tree->root ||
-	    node_names_equal(remote_node1, local_node2))
+	    node_names_equal(remote_node1, local_node2) ||
+	    sync_node_is_namespace_root(ctx->remote_tree, remote_node1) ||
+	    sync_node_is_namespace_root(ctx->remote_tree, remote_node2) ||
+	    sync_node_is_namespace_root(ctx->local_tree, local_node1) ||
+	    sync_node_is_namespace_root(ctx->local_tree, local_node2))
 		return FALSE;
 
 	return sync_rename_lower_ts(ctx, local_node1, remote_node1,
diff -r 0eb8d396949a -r 1a0ece9b39e5 src/doveadm/dsync/test-dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c	Mon Feb 09 21:45:04 2015 +0200
+++ b/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c	Mon Feb 09 21:58:13 2015 +0200
@@ -11,6 +11,12 @@
 #include <stdlib.h>
 
 #define MAX_DEPTH 4
+#define TEST_NAMESPACE_NAME "INBOX"
+
+static struct mail_namespace inbox_namespace = {
+	.prefix = TEST_NAMESPACE_NAME"/",
+	.prefix_len = sizeof(TEST_NAMESPACE_NAME)-1 + 1
+};
 
 char mail_namespace_get_sep(struct mail_namespace *ns ATTR_UNUSED)
 {
@@ -212,11 +218,51 @@
 	dsync_mailbox_tree_deinit(&orig_tree2);
 }
 
+static void
+test_tree_nodes_add_namespace(struct dsync_mailbox_node *node,
+			      struct mail_namespace *ns)
+{
+	for (; node != NULL; node = node->next) {
+		node->ns = ns;
+		test_tree_nodes_add_namespace(node->first_child, ns);
+	}
+}
+
+static void
+test_tree_add_namespace(struct dsync_mailbox_tree *tree,
+			struct mail_namespace *ns)
+{
+	struct dsync_mailbox_node *node, *n;
+
+	node = dsync_mailbox_tree_get(tree, TEST_NAMESPACE_NAME);
+	node->existence = DSYNC_MAILBOX_NODE_EXISTS;
+	i_assert(tree->root.first_child == node);
+	i_assert(node->first_child == NULL);
+	node->first_child = node->next;
+	for (n = node->first_child; n != NULL; n = n->next)
+		n->parent = node;
+	node->next = NULL;
+
+	test_tree_nodes_add_namespace(&tree->root, ns);
+}
+
 static void test_trees(struct dsync_mailbox_tree *tree1,
 		       struct dsync_mailbox_tree *tree2)
 {
+	struct dsync_mailbox_tree *tree1_dup, *tree2_dup;
+
+	tree1_dup = dsync_mailbox_tree_dup(tree1);
+	tree2_dup = dsync_mailbox_tree_dup(tree2);
+
+	/* test without namespace prefix */
 	test_trees_nofree(tree1, &tree2);
 	dsync_mailbox_tree_deinit(&tree1);
+
+	/* test with namespace prefix */
+	test_tree_add_namespace(tree1_dup, &inbox_namespace);
+	test_tree_add_namespace(tree2_dup, &inbox_namespace);
+	test_trees_nofree(tree1_dup, &tree2_dup);
+	dsync_mailbox_tree_deinit(&tree1_dup);
 }
 
 static void test_dsync_mailbox_tree_sync_creates(void)


More information about the dovecot-cvs mailing list