From: Timo Sirainen Date: Tue, 20 Sep 2011 10:33:34 +0000 (+0300) Subject: imapc: next_uid was sometimes lowered. X-Git-Tag: 2.1.beta1~159 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bcf478ad0160ea069192ef0568d3d1cd14a17fb2;p=thirdparty%2Fdovecot%2Fcore.git imapc: next_uid was sometimes lowered. --- diff --git a/src/lib-storage/index/imapc/imapc-sync.c b/src/lib-storage/index/imapc/imapc-sync.c index 3a95ad6b82..af0fe5839d 100644 --- a/src/lib-storage/index/imapc/imapc-sync.c +++ b/src/lib-storage/index/imapc/imapc-sync.c @@ -190,7 +190,7 @@ static void imapc_sync_expunge_eom(struct imapc_sync_context *ctx) mbox->sync_next_rseq = 0; } -static void imapc_sync_index_header(struct imapc_sync_context *ctx) +static void imapc_sync_uid_validity(struct imapc_sync_context *ctx) { struct imapc_mailbox *mbox = ctx->mbox; const struct mail_index_header *hdr; @@ -208,11 +208,22 @@ static void imapc_sync_index_header(struct imapc_sync_context *ctx) &mbox->sync_uid_validity, sizeof(mbox->sync_uid_validity), TRUE); } - if (hdr->next_uid < mbox->sync_uid_next) { +} + +static void imapc_sync_uid_next(struct imapc_sync_context *ctx) +{ + struct imapc_mailbox *mbox = ctx->mbox; + const struct mail_index_header *hdr; + uint32_t uid_next = mbox->sync_uid_next; + + if (uid_next < mbox->min_append_uid) + uid_next = mbox->min_append_uid; + + hdr = mail_index_get_header(ctx->sync_view); + if (hdr->next_uid < uid_next) { mail_index_update_header(ctx->trans, offsetof(struct mail_index_header, next_uid), - &mbox->sync_uid_next, sizeof(mbox->sync_uid_next), - FALSE); + &uid_next, sizeof(uid_next), FALSE); } } @@ -225,7 +236,7 @@ static void imapc_sync_index(struct imapc_sync_context *ctx) i_array_init(&ctx->expunged_uids, 64); ctx->keywords = mail_index_get_keywords(mbox->box.index); - imapc_sync_index_header(ctx); + 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, @@ -275,6 +286,9 @@ static void imapc_sync_index(struct imapc_sync_context *ctx) imapc_storage_run(mbox->storage); array_free(&ctx->expunged_uids); + /* add uidnext after all appends */ + imapc_sync_uid_next(ctx); + imapc_sync_expunge_eom(ctx); if (mbox->box.v.sync_notify != NULL) mbox->box.v.sync_notify(&mbox->box, 0, 0);