]> 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@dovecot.fi>
Tue, 26 Jun 2018 06:33:50 +0000 (09:33 +0300)
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 0a1bb6e0fa861e3b8617605ab5e7c73c7110b840..a023e3f70e6a3cd064fa6a6a7be06f85b3428b09 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 {
@@ -744,7 +744,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 42687620636a5502893011df3a24f84031815671..5ba9ba3ba5bf87851531c9fd185b29ef9b9fed2a 100644 (file)
@@ -788,7 +788,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 85c4ee4a6d3af1c6f8d29eb45aa8a07130a2f199..d23a90b2d476f41bba8c2854263f41ab470ab930 100644 (file)
@@ -192,7 +192,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 3db2fab1327c4159fc1c0ef2e176982cffe2c906..857271edee801b6cad4b880e3f208baafeb7ecf4 100644 (file)
@@ -512,7 +512,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);
@@ -579,7 +579,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)) &&