]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fix handling UIDVALIDITY changes
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 19 Jun 2018 09:33:49 +0000 (12:33 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 20 Jun 2018 06:35:51 +0000 (06:35 +0000)
Index was being correctly reset, but the transaction was rolled back.

src/lib-storage/index/imapc/imapc-mailbox.c
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/imapc/imapc-storage.h
src/lib-storage/index/imapc/imapc-sync.c

index f69fe983b3c20a2fc8f8c5dde1940de8b739da28..7906fe40c2b97f10868e149db6a711dcda8a4cd6 100644 (file)
@@ -94,7 +94,7 @@ static int imapc_mailbox_commit_delayed_expunges(struct imapc_mailbox *mbox)
 }
 
 int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox,
-                                      bool *changes_r)
+                                      bool force, bool *changes_r)
 {
        int ret = 0;
 
@@ -104,7 +104,7 @@ int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox,
                mail_index_view_close(&mbox->delayed_sync_view);
        if (mbox->delayed_sync_trans == NULL)
                ;
-       else if (!mbox->selected) {
+       else if (!mbox->selected && !force) {
                /* ignore any changes done during SELECT */
                mail_index_transaction_rollback(&mbox->delayed_sync_trans);
        } else {
@@ -753,7 +753,7 @@ static void imapc_sync_uid_validity(struct imapc_mailbox *mbox)
                        /* The reset needs to be committed before FETCH 1:*
                           results are received. */
                        bool changes;
-                       if (imapc_mailbox_commit_delayed_trans(mbox, &changes) < 0)
+                       if (imapc_mailbox_commit_delayed_trans(mbox, TRUE, &changes) < 0)
                                mail_index_mark_corrupted(mbox->box.index);
                        imapc_mailbox_init_delayed_trans(mbox);
                }
index 552c5d05ad82bb7d2b9b7f7dac7c1edadb4a8978..3534017559c09ba7ee5adf47be04bf8cf90f3253 100644 (file)
@@ -805,7 +805,7 @@ static void imapc_mailbox_close(struct mailbox *box)
        struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
        bool changes;
 
-       (void)imapc_mailbox_commit_delayed_trans(mbox, &changes);
+       (void)imapc_mailbox_commit_delayed_trans(mbox, FALSE, &changes);
        imapc_mail_fetch_flush(mbox);
        if (mbox->client_box != NULL)
                imapc_client_mailbox_close(&mbox->client_box);
index 291f7df9fbdc1290c8d99fb898f78518a2523780..10d1ea4e2ad5d3672b7d5ed8777d6384375205b7 100644 (file)
@@ -193,7 +193,7 @@ void imapc_simple_run(struct imapc_simple_context *sctx,
 void imapc_simple_callback(const struct imapc_command_reply *reply,
                           void *context);
 int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox,
-                                      bool *changes_r);
+                                      bool force, bool *changes_r);
 void imapc_mailbox_noop(struct imapc_mailbox *mbox);
 void imapc_mailbox_set_corrupted(struct imapc_mailbox *mbox,
                                 const char *reason, ...) ATTR_FORMAT(2, 3);
index 373fce70296404dfe2cdf9e0c5611b125c358165..108de4a25a5bbb6cb007399d06de9f87506466d2 100644 (file)
@@ -518,7 +518,7 @@ static int imapc_sync_finish(struct imapc_sync_context **_ctx)
 
        /* this is done simply to commit delayed expunges if there are any
           (has to be done after sync is committed) */
-       if (imapc_mailbox_commit_delayed_trans(ctx->mbox, &changes) < 0)
+       if (imapc_mailbox_commit_delayed_trans(ctx->mbox, FALSE, &changes) < 0)
                ctx->failed = TRUE;
 
        i_free(ctx);
@@ -585,7 +585,7 @@ imapc_mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
                /* initial FETCH failed already */
                ret = -1;
        }
-       if (imapc_mailbox_commit_delayed_trans(mbox, &changes) < 0)
+       if (imapc_mailbox_commit_delayed_trans(mbox, FALSE, &changes) < 0)
                ret = -1;
        if ((changes || mbox->sync_fetch_first_uid != 0 ||
             index_mailbox_want_full_sync(&mbox->box, flags)) &&