From: Timo Sirainen Date: Mon, 25 Dec 2017 17:19:09 +0000 (+0200) Subject: imapc: Handle untagged UIDVALIDITY immediately X-Git-Tag: 2.2.34~129 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aad8bfbe959374a7cf4aa7b1768cfeef28c42560;p=thirdparty%2Fdovecot%2Fcore.git imapc: Handle untagged UIDVALIDITY immediately This is part of the changes to fix mailbox resyncing after reconnect. --- diff --git a/src/lib-storage/index/imapc/imapc-mailbox.c b/src/lib-storage/index/imapc/imapc-mailbox.c index 013718998b..9d2dae2d92 100644 --- a/src/lib-storage/index/imapc/imapc-mailbox.c +++ b/src/lib-storage/index/imapc/imapc-mailbox.c @@ -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); } } diff --git a/src/lib-storage/index/imapc/imapc-sync.c b/src/lib-storage/index/imapc/imapc-sync.c index b3f49c49d4..8f1975218e 100644 --- a/src/lib-storage/index/imapc/imapc-sync.c +++ b/src/lib-storage/index/imapc/imapc-sync.c @@ -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,