dovecot-2.2: dsync: Don't try to rename namespace roots.
dovecot at dovecot.org
dovecot at dovecot.org
Wed May 6 13:18:11 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/6612d20f2fb8
changeset: 18532:6612d20f2fb8
user: Timo Sirainen <tss at iki.fi>
date: Wed May 06 16:16:11 2015 +0300
description:
dsync: Don't try to rename namespace roots.
It'll just cause an assert-crash.
diffstat:
src/doveadm/dsync/dsync-mailbox-tree-sync.c | 38 ++++++++++++++---------
src/doveadm/dsync/test-dsync-mailbox-tree-sync.c | 26 +++++++++++++++-
2 files changed, 48 insertions(+), 16 deletions(-)
diffs (126 lines):
diff -r 13c933ed6371 -r 6612d20f2fb8 src/doveadm/dsync/dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-mailbox-tree-sync.c Wed May 06 16:01:45 2015 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-tree-sync.c Wed May 06 16:16:11 2015 +0300
@@ -363,6 +363,9 @@
const char *full_name;
unsigned int prefix_len = node->ns == NULL ? 0 : node->ns->prefix_len;
+ if (strcmp(node->name, "INBOX") == 0 && node->parent == &tree->root)
+ return TRUE;
+
if (prefix_len == 0)
return FALSE;
@@ -585,6 +588,16 @@
return ts;
}
+static bool sync_node_is_namespace_root(struct dsync_mailbox_tree *tree,
+ struct dsync_mailbox_node *node)
+{
+ if (node == NULL)
+ return FALSE;
+ if (node == &tree->root)
+ return TRUE;
+ return sync_node_is_namespace_prefix(tree, node);
+}
+
static bool ATTR_NULL(3, 4)
sync_rename_lower_ts(struct dsync_mailbox_tree_sync_ctx *ctx,
struct dsync_mailbox_node *local_node1,
@@ -604,6 +617,16 @@
at all. Note that node1 and node2 may be the same node pointers. */
i_assert(strcmp(local_node1->name, remote_node2->name) == 0);
+ if (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)) {
+ local_node1->sync_delayed_guid_change = TRUE;
+ remote_node2->sync_delayed_guid_change = TRUE;
+ *reason_r = "Can't rename namespace prefixes - will be merged later";
+ return FALSE;
+ }
+
local_ts = nodes_get_timestamp(local_node1, local_node2);
remote_ts = nodes_get_timestamp(remote_node1, remote_node2);
@@ -791,14 +814,6 @@
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,
@@ -821,13 +836,6 @@
*reason_r = "Directory name paths are equal";
return FALSE;
}
- if (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)) {
- *reason_r = "Directory is part of namespace prefix";
- return FALSE;
- }
return sync_rename_lower_ts(ctx, local_node1, remote_node1,
local_node2, remote_node2, reason_r);
diff -r 13c933ed6371 -r 6612d20f2fb8 src/doveadm/dsync/test-dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Wed May 06 16:01:45 2015 +0300
+++ b/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Wed May 06 16:16:11 2015 +0300
@@ -181,7 +181,8 @@
dsync_mailbox_tree_build_guid_hash(tree1, &dup_node1, &dup_node2);
dsync_mailbox_tree_build_guid_hash(tree2, &dup_node1, &dup_node2);
ctx = dsync_mailbox_trees_sync_init(tree1, tree2,
- DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY, 0);
+ DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY,
+ DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG);
while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
}
dsync_mailbox_trees_sync_deinit(&ctx);
@@ -681,6 +682,28 @@
test_end();
}
+static void test_dsync_mailbox_tree_sync_renames21(void)
+{
+#if 0
+ /* FIXME: we can't currently test this without crashing */
+ struct dsync_mailbox_tree *tree1, *tree2;
+
+ test_begin("dsync mailbox tree sync renames 21");
+ tree1 = dsync_mailbox_tree_init('/', '_');
+ tree2 = dsync_mailbox_tree_init('/', '_');
+
+ node_create(tree1, 1, "INBOX", 0);
+ node_create(tree1, 2, "foo", 0);
+ /* swap INBOX and foo - the INBOX name is important since it's
+ treated specially */
+ node_create(tree2, 1, "foo", 0);
+ node_create(tree2, 2, "INBOX", 1);
+
+ test_trees(tree1, tree2);
+ test_end();
+#endif
+}
+
static void test_dsync_mailbox_tree_sync_random(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
@@ -717,6 +740,7 @@
test_dsync_mailbox_tree_sync_renames18,
test_dsync_mailbox_tree_sync_renames19,
test_dsync_mailbox_tree_sync_renames20,
+ test_dsync_mailbox_tree_sync_renames21,
test_dsync_mailbox_tree_sync_random,
NULL
};
More information about the dovecot-cvs
mailing list