]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: If unexpected changes happened during sync, log a warning and exit with code 2.
authorTimo Sirainen <tss@iki.fi>
Wed, 5 Jun 2013 14:14:49 +0000 (17:14 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 5 Jun 2013 14:14:49 +0000 (17:14 +0300)
This was done by v2.1 dsync, but the code got temporarily lost in v2.2.

src/doveadm/dsync/doveadm-dsync.c
src/doveadm/dsync/dsync-brain.c
src/doveadm/dsync/dsync-brain.h

index a1e6e9d8b3b97ee9b9ae898f47701a6b0548b43a..4957a3c57eecfd4b3db472ed3c21ae6ffb950b87 100644 (file)
@@ -291,7 +291,8 @@ static bool paths_are_equal(struct mail_user *user1, struct mail_user *user2,
 
 static int
 cmd_dsync_run_local(struct dsync_cmd_context *ctx, struct mail_user *user,
-                   struct dsync_brain *brain, struct dsync_ibc *ibc2)
+                   struct dsync_brain *brain, struct dsync_ibc *ibc2,
+                   bool *changes_during_sync_r)
 {
        struct dsync_brain *brain2;
        struct mail_user *user2;
@@ -357,6 +358,7 @@ cmd_dsync_run_local(struct dsync_cmd_context *ctx, struct mail_user *user,
                brain2_running = dsync_brain_run(brain2, &changed2);
        }
        mail_user_unref(&user2);
+       *changes_during_sync_r = dsync_brain_has_unexpected_changes(brain2);
        if (dsync_brain_deinit(&brain2) < 0) {
                ctx->ctx.exit_code = EX_TEMPFAIL;
                return -1;
@@ -490,6 +492,7 @@ cmd_dsync_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
        struct dsync_brain_settings set;
        enum dsync_brain_flags brain_flags;
        bool remote_errors_logged = FALSE;
+       bool changes_during_sync = FALSE;
        int status = 0, ret = 0;
 
        memset(&set, 0, sizeof(set));
@@ -540,7 +543,8 @@ cmd_dsync_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
                                        brain_flags, &set);
 
        if (ctx->run_type == DSYNC_RUN_TYPE_LOCAL) {
-               if (cmd_dsync_run_local(ctx, user, brain, ibc2) < 0)
+               if (cmd_dsync_run_local(ctx, user, brain, ibc2,
+                                       &changes_during_sync) < 0)
                        ret = -1;
        } else {
                cmd_dsync_run_remote(user);
@@ -552,6 +556,11 @@ cmd_dsync_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
                doveadm_print(str_c(state_str));
        }
 
+       if (dsync_brain_has_unexpected_changes(brain) || changes_during_sync) {
+               i_warning("Mailbox changes caused a desync. "
+                         "You may want to run dsync again.");
+               ctx->ctx.exit_code = 2;
+       }
        if (dsync_brain_deinit(&brain) < 0) {
                ctx->ctx.exit_code = EX_TEMPFAIL;
                ret = -1;
index 803c44725d71a5b2201e981c0c7aefc2957c6d9d..a6b4bd4c0cb4db4e3958b1ea6be7db2c1cacba5e 100644 (file)
@@ -513,3 +513,8 @@ bool dsync_brain_has_failed(struct dsync_brain *brain)
 {
        return brain->failed;
 }
+
+bool dsync_brain_has_unexpected_changes(struct dsync_brain *brain)
+{
+       return brain->changes_during_sync;
+}
index 6d7c218742e13b948b472d1cd19bc3dc1d961812..c280908f3e7f9340dcfde802ec5af031f91ab226 100644 (file)
@@ -67,5 +67,7 @@ bool dsync_brain_has_failed(struct dsync_brain *brain);
 void dsync_brain_get_state(struct dsync_brain *brain, string_t *output);
 /* Returns the sync type that was used. Mainly useful with slave brain. */
 enum dsync_brain_sync_type dsync_brain_get_sync_type(struct dsync_brain *brain);
+/* Returns TRUE if there were any unexpected changes during the sync. */
+bool dsync_brain_has_unexpected_changes(struct dsync_brain *brain);
 
 #endif