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