]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Handle untagged UIDVALIDITY immediately
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 25 Dec 2017 17:19:09 +0000 (19:19 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Thu, 18 Jan 2018 10:07:06 +0000 (12:07 +0200)
This is part of the changes to fix mailbox resyncing after reconnect.

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

index 013718998b445015eeb67ec1c567ef9a3f0e7846..9d2dae2d922c858062deef3d2d9b59d3d5d71f48 100644 (file)
@@ -589,6 +589,26 @@ static void imapc_untagged_esearch(const struct imapc_untagged_reply *reply,
                imapc_search_reply_esearch(reply->args+1, mbox);
 }
 
+static void imapc_sync_uid_validity(struct imapc_mailbox *mbox)
+{
+       const struct mail_index_header *hdr;
+
+       imapc_mailbox_init_delayed_trans(mbox);
+       hdr = mail_index_get_header(mbox->delayed_sync_view);
+       if (hdr->uid_validity != mbox->sync_uid_validity &&
+           mbox->sync_uid_validity != 0) {
+               if (hdr->uid_validity != 0) {
+                       /* uidvalidity changed, reset the entire mailbox */
+                       mail_index_reset(mbox->delayed_sync_trans);
+                       mbox->sync_fetch_first_uid = 1;
+               }
+               mail_index_update_header(mbox->delayed_sync_trans,
+                       offsetof(struct mail_index_header, uid_validity),
+                       &mbox->sync_uid_validity,
+                       sizeof(mbox->sync_uid_validity), TRUE);
+       }
+}
+
 static void
 imapc_resp_text_uidvalidity(const struct imapc_untagged_reply *reply,
                            struct imapc_mailbox *mbox)
@@ -603,6 +623,7 @@ imapc_resp_text_uidvalidity(const struct imapc_untagged_reply *reply,
        if (mbox->sync_uid_validity != uid_validity) {
                mbox->sync_uid_validity = uid_validity;
                imapc_mail_cache_free(&mbox->prev_mail_cache);
+               imapc_sync_uid_validity(mbox);
        }
 }
 
index b3f49c49d4412b53c72a8391fd70e7f8dbe9608b..8f1975218e46fed1efb59306743e6bbf75d832f1 100644 (file)
@@ -291,26 +291,6 @@ static void imapc_sync_expunge_eom(struct imapc_sync_context *ctx)
        mbox->sync_next_rseq = 0;
 }
 
-static void imapc_sync_uid_validity(struct imapc_sync_context *ctx)
-{
-       struct imapc_mailbox *mbox = ctx->mbox;
-       const struct mail_index_header *hdr;
-
-       hdr = mail_index_get_header(ctx->sync_view);
-       if (hdr->uid_validity != mbox->sync_uid_validity &&
-           mbox->sync_uid_validity != 0) {
-               if (hdr->uid_validity != 0) {
-                       /* uidvalidity changed, reset the entire mailbox */
-                       mail_index_reset(ctx->trans);
-                       mbox->sync_fetch_first_uid = 1;
-               }
-               mail_index_update_header(ctx->trans,
-                       offsetof(struct mail_index_header, uid_validity),
-                       &mbox->sync_uid_validity,
-                       sizeof(mbox->sync_uid_validity), TRUE);
-       }
-}
-
 static void imapc_sync_uid_next(struct imapc_sync_context *ctx)
 {
        struct imapc_mailbox *mbox = ctx->mbox;
@@ -451,7 +431,6 @@ static void imapc_sync_index(struct imapc_sync_context *ctx)
        ctx->keywords = mail_index_get_keywords(mbox->box.index);
        ctx->pool = pool_alloconly_create("imapc sync pool", 1024);
 
-       imapc_sync_uid_validity(ctx);
        while (mail_index_sync_next(ctx->index_sync_ctx, &sync_rec)) T_BEGIN {
                if (!mail_index_lookup_seq_range(ctx->sync_view,
                                                 sync_rec.uid1, sync_rec.uid2,