dovecot-2.2: dsync: Fixed syncing renaming mailboxes with children.
dovecot at dovecot.org
dovecot at dovecot.org
Fri Jun 14 00:24:01 EEST 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/d36f6b256bc0
changeset: 16516:d36f6b256bc0
user: Timo Sirainen <tss at iki.fi>
date: Fri Jun 14 00:23:45 2013 +0300
description:
dsync: Fixed syncing renaming mailboxes with children.
So that the childrens' rename timestamps are at least as high as their
parents'.
diffstat:
src/doveadm/dsync/dsync-mailbox-tree-sync.c | 16 +++++++++
src/doveadm/dsync/test-dsync-mailbox-tree-sync.c | 39 +++++++++++++++++++++--
2 files changed, 51 insertions(+), 4 deletions(-)
diffs (111 lines):
diff -r 3ef37c649d27 -r d36f6b256bc0 src/doveadm/dsync/dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-mailbox-tree-sync.c Fri Jun 14 00:16:58 2013 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-tree-sync.c Fri Jun 14 00:23:45 2013 +0300
@@ -1140,6 +1140,20 @@
&ctx->remote_tree->root);
}
+static void
+dsync_mailbox_tree_update_child_timestamps(struct dsync_mailbox_node *node,
+ time_t parent_timestamp)
+{
+ time_t ts;
+
+ if (node->last_renamed_or_created < parent_timestamp)
+ node->last_renamed_or_created = parent_timestamp;
+ ts = node->last_renamed_or_created;
+
+ for (node = node->first_child; node != NULL; node = node->next)
+ dsync_mailbox_tree_update_child_timestamps(node, ts);
+}
+
struct dsync_mailbox_tree_sync_ctx *
dsync_mailbox_trees_sync_init(struct dsync_mailbox_tree *local_tree,
struct dsync_mailbox_tree *remote_tree,
@@ -1166,6 +1180,8 @@
ignore_deletes = sync_type == DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE;
sync_tree_sort_and_delete_mailboxes(ctx, local_tree, ignore_deletes);
+ dsync_mailbox_tree_update_child_timestamps(&local_tree->root, 0);
+ dsync_mailbox_tree_update_child_timestamps(&remote_tree->root, 0);
while (sync_rename_mailboxes(ctx, &local_tree->root, &remote_tree->root)) ;
while (sync_rename_temp_mailboxes(ctx, local_tree, &local_tree->root)) ;
while (sync_rename_temp_mailboxes(ctx, remote_tree, &remote_tree->root)) ;
diff -r 3ef37c649d27 -r d36f6b256bc0 src/doveadm/dsync/test-dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Fri Jun 14 00:16:58 2013 +0300
+++ b/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Fri Jun 14 00:23:45 2013 +0300
@@ -154,9 +154,10 @@
nodes_dump(tree2->root.first_child, 1);
}
-static void test_trees(struct dsync_mailbox_tree *tree1,
- struct dsync_mailbox_tree *tree2)
+static void test_trees_nofree(struct dsync_mailbox_tree *tree1,
+ struct dsync_mailbox_tree **_tree2)
{
+ struct dsync_mailbox_tree *tree2 = *_tree2;
struct dsync_mailbox_tree *orig_tree1, *orig_tree2;
struct dsync_mailbox_tree_sync_ctx *ctx;
struct dsync_mailbox_node *dup_node1, *dup_node2;
@@ -201,12 +202,18 @@
trees_dump(tree1, orig_tree1);
}
- dsync_mailbox_tree_deinit(&tree1);
- dsync_mailbox_tree_deinit(&tree2);
+ dsync_mailbox_tree_deinit(_tree2);
dsync_mailbox_tree_deinit(&orig_tree1);
dsync_mailbox_tree_deinit(&orig_tree2);
}
+static void test_trees(struct dsync_mailbox_tree *tree1,
+ struct dsync_mailbox_tree *tree2)
+{
+ test_trees_nofree(tree1, &tree2);
+ dsync_mailbox_tree_deinit(&tree1);
+}
+
static void test_dsync_mailbox_tree_sync_creates(void)
{
static const char *common_nodes[] = { "foo", "foo/bar", NULL };
@@ -600,9 +607,32 @@
test_end();
}
+static void test_dsync_mailbox_tree_sync_renames20(void)
+{
+ struct dsync_mailbox_tree *tree1, *tree2;
+
+ test_begin("dsync mailbox tree sync renames 20");
+ tree1 = dsync_mailbox_tree_init('/', '_');
+ tree2 = dsync_mailbox_tree_init('/', '_');
+
+ node_create(tree1, 1, "1", 0);
+ node_create(tree1, 2, "0", 0);
+ node_create(tree1, 3, "0/2", 0);
+ /* rename 0 -> 1/0 */
+ node_create(tree2, 1, "1", 0);
+ node_create(tree2, 2, "1/0", 1);
+ node_create(tree2, 3, "1/0/2", 0);
+
+ test_trees_nofree(tree1, &tree2);
+ test_assert(tree1->root.first_child->next == NULL);
+ dsync_mailbox_tree_deinit(&tree1);
+ test_end();
+}
+
static void test_dsync_mailbox_tree_sync_random(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
+ unsigned int i;
test_begin("dsync mailbox tree sync random");
tree1 = create_random_tree();
@@ -635,6 +665,7 @@
test_dsync_mailbox_tree_sync_renames17,
test_dsync_mailbox_tree_sync_renames18,
test_dsync_mailbox_tree_sync_renames19,
+ test_dsync_mailbox_tree_sync_renames20,
test_dsync_mailbox_tree_sync_random,
NULL
};
More information about the dovecot-cvs
mailing list