dovecot-2.2: doveadm backup: Fix to handling mailbox deletions.
dovecot at dovecot.org
dovecot at dovecot.org
Mon Apr 7 21:21:11 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/57a490780b1e
changeset: 17202:57a490780b1e
user: Timo Sirainen <tss at iki.fi>
date: Tue Apr 08 00:20:57 2014 +0300
description:
doveadm backup: Fix to handling mailbox deletions.
diffstat:
src/doveadm/dsync/dsync-mailbox-tree-sync.c | 47 ++++++++++++++++++++++++----
1 files changed, 39 insertions(+), 8 deletions(-)
diffs (88 lines):
diff -r 3bff23b6c187 -r 57a490780b1e src/doveadm/dsync/dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-mailbox-tree-sync.c Tue Apr 08 00:09:03 2014 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-tree-sync.c Tue Apr 08 00:20:57 2014 +0300
@@ -199,10 +199,16 @@
sync_delete_mailbox_node(ctx, tree, node, reason);
}
+enum del_sync_type {
+ DEL_SYNC_TYPE_TWOWAY,
+ DEL_SYNC_TYPE_RESTORE,
+ DEL_SYNC_TYPE_IGNORE
+};
+
static void
sync_tree_sort_and_delete_mailboxes(struct dsync_mailbox_tree_sync_ctx *ctx,
struct dsync_mailbox_tree *tree,
- bool ignore_deletes)
+ enum del_sync_type del_sync_type)
{
struct dsync_mailbox_tree_bfs_iter *iter;
struct dsync_mailbox_node *node, *parent = NULL;
@@ -219,15 +225,20 @@
}
if (node->existence == DSYNC_MAILBOX_NODE_DELETED &&
!dsync_mailbox_node_is_dir(node)) {
- if (!ignore_deletes) {
+ switch (del_sync_type) {
+ case DEL_SYNC_TYPE_TWOWAY:
/* this mailbox was deleted. delete it from the
other side as well */
sync_delete_mailbox(ctx, tree, node,
"Mailbox has been deleted");
- } else {
+ break;
+ case DEL_SYNC_TYPE_RESTORE:
/* we want to restore the mailbox back.
just treat it as if it didn't exist */
sync_set_node_deleted(tree, node);
+ break;
+ case DEL_SYNC_TYPE_IGNORE:
+ break;
}
}
array_append(&siblings, &node, 1);
@@ -1202,7 +1213,7 @@
{
struct dsync_mailbox_tree_sync_ctx *ctx;
pool_t pool;
- bool ignore_deletes;
+ enum del_sync_type del_sync_type;
i_assert(hash_table_is_created(local_tree->guid_hash));
i_assert(hash_table_is_created(remote_tree->guid_hash));
@@ -1217,10 +1228,30 @@
ctx->sync_flags = sync_flags;
i_array_init(&ctx->changes, 128);
- ignore_deletes = sync_type == DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE;
- sync_tree_sort_and_delete_mailboxes(ctx, remote_tree, ignore_deletes);
- ignore_deletes = sync_type == DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL;
- sync_tree_sort_and_delete_mailboxes(ctx, local_tree, ignore_deletes);
+ switch (sync_type) {
+ case DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY:
+ del_sync_type = DEL_SYNC_TYPE_TWOWAY;
+ break;
+ case DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE:
+ del_sync_type = DEL_SYNC_TYPE_IGNORE;
+ break;
+ case DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL:
+ del_sync_type = DEL_SYNC_TYPE_RESTORE;
+ break;
+ }
+ sync_tree_sort_and_delete_mailboxes(ctx, remote_tree, del_sync_type);
+ switch (sync_type) {
+ case DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY:
+ del_sync_type = DEL_SYNC_TYPE_TWOWAY;
+ break;
+ case DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE:
+ del_sync_type = DEL_SYNC_TYPE_RESTORE;
+ break;
+ case DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL:
+ del_sync_type = DEL_SYNC_TYPE_IGNORE;
+ break;
+ }
+ sync_tree_sort_and_delete_mailboxes(ctx, local_tree, del_sync_type);
dsync_mailbox_tree_update_child_timestamps(&local_tree->root, 0);
dsync_mailbox_tree_update_child_timestamps(&remote_tree->root, 0);
More information about the dovecot-cvs
mailing list