Mercurial > dovecot > core-2.2
changeset 16516:d36f6b256bc0
dsync: Fixed syncing renaming mailboxes with children.
So that the childrens' rename timestamps are at least as high as their
parents'.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 14 Jun 2013 00:23:45 +0300 |
parents | 3ef37c649d27 |
children | 30f00db1a8b0 |
files | src/doveadm/dsync/dsync-mailbox-tree-sync.c src/doveadm/dsync/test-dsync-mailbox-tree-sync.c |
diffstat | 2 files changed, 51 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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)) ;
--- 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 };