]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: Added -1 parameter to do a "one way sync" without reverting changes.
authorTimo Sirainen <tss@iki.fi>
Wed, 26 Jun 2013 17:53:01 +0000 (20:53 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 26 Jun 2013 17:53:01 +0000 (20:53 +0300)
This can be useful during migration when you don't want to delete any mails,
but you also don't want to send changes to the old server either.

src/doveadm/dsync/doveadm-dsync.c
src/doveadm/dsync/dsync-brain-mailbox-tree-sync.c
src/doveadm/dsync/dsync-brain-mailbox-tree.c
src/doveadm/dsync/dsync-brain-mailbox.c
src/doveadm/dsync/dsync-brain-private.h
src/doveadm/dsync/dsync-brain.c
src/doveadm/dsync/dsync-brain.h
src/doveadm/dsync/dsync-ibc-stream.c

index b676afc7bb4d3eab20c6d23de7a871639f7fd04e..a032a61060b5a21a290012b713a15ae33b61def3 100644 (file)
@@ -36,7 +36,7 @@
 #include <ctype.h>
 #include <sys/wait.h>
 
-#define DSYNC_COMMON_GETOPT_ARGS "+dEfg:l:m:n:Nr:Rs:Ux:"
+#define DSYNC_COMMON_GETOPT_ARGS "+1dEfg:l:m:n:Nr:Rs:Ux:"
 #define DSYNC_REMOTE_CMD_EXIT_WAIT_SECS 30
 /* The broken_char is mainly set to get a proper error message when trying to
    convert a mailbox with a name that can't be used properly translated between
@@ -80,6 +80,7 @@ struct dsync_cmd_context {
        unsigned int lock:1;
        unsigned int sync_visible_namespaces:1;
        unsigned int default_replica_location:1;
+       unsigned int oneway:1;
        unsigned int backup:1;
        unsigned int reverse_backup:1;
        unsigned int remote_user_prefix:1;
@@ -553,6 +554,8 @@ cmd_dsync_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
 
        if (ctx->no_mail_sync)
                brain_flags |= DSYNC_BRAIN_FLAG_NO_MAIL_SYNC;
+       if (ctx->oneway)
+               brain_flags |= DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE;
        if (doveadm_debug)
                brain_flags |= DSYNC_BRAIN_FLAG_DEBUG;
 
@@ -852,6 +855,10 @@ cmd_mailbox_dsync_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
        const char *str;
 
        switch (c) {
+       case '1':
+               ctx->oneway = TRUE;
+               ctx->backup = TRUE;
+               break;
        case 'd':
                ctx->default_replica_location = TRUE;
                break;
@@ -894,8 +901,6 @@ cmd_mailbox_dsync_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
                ctx->rawlog_path = optarg;
                break;
        case 'R':
-               if (!ctx->backup)
-                       return FALSE;
                ctx->reverse_backup = TRUE;
                break;
        case 's':
@@ -1033,11 +1038,11 @@ static struct doveadm_mail_cmd_context *cmd_dsync_server_alloc(void)
 
 struct doveadm_mail_cmd cmd_dsync_mirror = {
        cmd_dsync_alloc, "sync",
-       "[-dfR] [-l <secs>] [-m <mailbox>] [-n <namespace>] [-x <exclude>] [-s <state>] <dest>"
+       "[-1dfR] [-l <secs>] [-r <rawlog path>] [-m <mailbox>] [-n <namespace> | -N] [-x <exclude>] [-s <state>] <dest>"
 };
 struct doveadm_mail_cmd cmd_dsync_backup = {
        cmd_dsync_backup_alloc, "backup",
-       "[-dfR] [-l <secs>] [-m <mailbox>] [-n <namespace>] [-x <exclude>] [-s <state>] <dest>"
+       "[-dfR] [-l <secs>] [-r <rawlog path>] [-m <mailbox>] [-n <namespace> | -N] [-x <exclude>] [-s <state>] <dest>"
 };
 struct doveadm_mail_cmd cmd_dsync_server = {
        cmd_dsync_server_alloc, "dsync-server", &doveadm_mail_cmd_hide
index 306bc2939d011c08b8d7264eb9478df72a28fc8c..341413e7a58090503cf67ed3612546f8392dc035 100644 (file)
@@ -102,7 +102,10 @@ int dsync_brain_mailbox_tree_sync_change(struct dsync_brain *brain,
        enum mail_error error;
        int ret = -1;
 
-       i_assert(!brain->backup_send);
+       if (brain->backup_send) {
+               i_assert(brain->no_backup_overwrite);
+               return 0;
+       }
 
        switch (change->type) {
        case DSYNC_MAILBOX_TREE_SYNC_TYPE_DELETE_BOX:
index 64dd88106b173dfc212b730ab9aff8b430f3c3fe..7eb13e851c86b4af57c35b4495efe15efe623133 100644 (file)
@@ -269,7 +269,9 @@ static void dsync_brain_mailbox_trees_sync(struct dsync_brain *brain)
        const struct dsync_mailbox_tree_sync_change *change;
        enum dsync_mailbox_trees_sync_type sync_type;
 
-       if (brain->backup_send)
+       if (brain->no_backup_overwrite)
+               sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY;
+       else if (brain->backup_send)
                sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL;
        else if (brain->backup_recv)
                sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE;
index b63274fb4b16566ce31186c69af3695ded776171..7d0f28cdb918179d3a158a59914b57a20ee3f972 100644 (file)
@@ -171,7 +171,7 @@ dsync_brain_sync_mailbox_init_remote(struct dsync_brain *brain,
                import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_WANT_MAIL_REQUESTS;
        if (brain->master_brain)
                import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_MASTER_BRAIN;
-       if (brain->backup_recv)
+       if (brain->backup_recv && !brain->no_backup_overwrite)
                import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_REVERT_LOCAL_CHANGES;
        if (brain->debug)
                import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_DEBUG;
index e50ea549814bf12e162f60b7daf94f34990f9372..06c897055bdfdba0bd1bd590ff6739f0d374bf3d 100644 (file)
@@ -95,6 +95,7 @@ struct dsync_brain {
        unsigned int debug:1;
        unsigned int sync_visible_namespaces:1;
        unsigned int no_mail_sync:1;
+       unsigned int no_backup_overwrite:1;
        unsigned int changes_during_sync:1;
        unsigned int verbose_proctitle:1;
        unsigned int failed:1;
index 2208894e3c66b3bc840c6f1472e0102c2fc9e01e..e623529ed9781d169711acce030f6fe787c00112 100644 (file)
@@ -130,6 +130,8 @@ dsync_brain_set_flags(struct dsync_brain *brain, enum dsync_brain_flags flags)
        brain->sync_visible_namespaces =
                (flags & DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES) != 0;
        brain->no_mail_sync = (flags & DSYNC_BRAIN_FLAG_NO_MAIL_SYNC) != 0;
+       brain->no_backup_overwrite =
+               (flags & DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE) != 0;
 }
 
 struct dsync_brain *
index d8b47871a9ab29f690eb647b0133cfd57ddf850c..8884e8bcfe6850984b3c4158329e62a5db85f509 100644 (file)
@@ -15,7 +15,11 @@ enum dsync_brain_flags {
        DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES= 0x10,
        /* Sync everything but the actual mails (e.g. mailbox creates,
           deletes) */
-       DSYNC_BRAIN_FLAG_NO_MAIL_SYNC           = 0x20
+       DSYNC_BRAIN_FLAG_NO_MAIL_SYNC           = 0x20,
+       /* Used with BACKUP_SEND/RECV: Don't force the
+          Use the two-way syncing algorithm, but don't actually modify
+          anything locally. (Useful during migration.) */
+       DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE    = 0x40
 };
 
 enum dsync_brain_sync_type {
index 8411bf1c388c14d7f52b0f2430ce52122fc15364..66d34fc8f7b56efa67d547e9a9686b7bf8fbae54 100644 (file)
@@ -75,7 +75,7 @@ static const struct {
          .optional_keys = "sync_ns_prefix sync_box sync_box_guid sync_type "
                "debug sync_visible_namespaces exclude_mailboxes "
                "send_mail_requests backup_send backup_recv lock_timeout"
-               "no_mail_sync"
+               "no_mail_sync no_backup_overwrite"
        },
        { .name = "mailbox_state",
          .chr = 'S',
@@ -644,6 +644,8 @@ dsync_ibc_stream_send_handshake(struct dsync_ibc *_ibc,
                dsync_serializer_encode_add(encoder, "sync_visible_namespaces", "");
        if ((set->brain_flags & DSYNC_BRAIN_FLAG_NO_MAIL_SYNC) != 0)
                dsync_serializer_encode_add(encoder, "no_mail_sync", "");
+       if ((set->brain_flags & DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE) != 0)
+               dsync_serializer_encode_add(encoder, "no_backup_overwrite", "");
 
        dsync_serializer_encode_finish(&encoder, str);
        dsync_ibc_stream_send_string(ibc, str);
@@ -727,6 +729,8 @@ dsync_ibc_stream_recv_handshake(struct dsync_ibc *_ibc,
                set->brain_flags |= DSYNC_BRAIN_FLAG_SYNC_VISIBLE_NAMESPACES;
        if (dsync_deserializer_decode_try(decoder, "no_mail_sync", &value))
                set->brain_flags |= DSYNC_BRAIN_FLAG_NO_MAIL_SYNC;
+       if (dsync_deserializer_decode_try(decoder, "no_backup_overwrite", &value))
+               set->brain_flags |= DSYNC_BRAIN_FLAG_NO_BACKUP_OVERWRITE;
 
        *set_r = set;
        return DSYNC_IBC_RECV_RET_OK;