From 5375aa138868dc2c45eb1a4ff37a0b577c2814f8 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 10 May 2004 02:52:13 +0300 Subject: [PATCH] syncing fixes --HG-- branch : HEAD --- src/lib-index/mail-index-view-sync.c | 1 + src/lib-storage/index/maildir/maildir-sync.c | 10 ++++++---- src/lib-storage/index/maildir/maildir-uidlist.c | 9 ++++++--- src/lib-storage/index/maildir/maildir-uidlist.h | 3 ++- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/lib-index/mail-index-view-sync.c b/src/lib-index/mail-index-view-sync.c index 9f02f8dde2..69cce524ef 100644 --- a/src/lib-index/mail-index-view-sync.c +++ b/src/lib-index/mail-index-view-sync.c @@ -353,6 +353,7 @@ void mail_index_view_sync_end(struct mail_index_view_sync_ctx *ctx) mail_index_unmap(view->index, view->map); view->map = ctx->sync_map; + view->map_protected = FALSE; mail_transaction_log_view_unset(view->log_view); diff --git a/src/lib-storage/index/maildir/maildir-sync.c b/src/lib-storage/index/maildir/maildir-sync.c index fb97254c38..54fdc2e20d 100644 --- a/src/lib-storage/index/maildir/maildir-sync.c +++ b/src/lib-storage/index/maildir/maildir-sync.c @@ -559,7 +559,8 @@ static int maildir_sync_index(struct maildir_sync_context *ctx) is updated? shouldn't really happen.. */ mail_storage_set_critical(ibox->box.storage, "Maildir sync: UID < next_uid " - "(%u < %u)", uid, hdr->next_uid); + "(%u < %u, file = %s)", + uid, hdr->next_uid, filename); mail_index_mark_corrupted(ibox->index); ret = -1; break; @@ -678,9 +679,10 @@ static int maildir_sync_context(struct maildir_sync_context *ctx) } /* finish uidlist syncing, but keep it still locked */ - maildir_uidlist_sync_finish(ctx->uidlist_sync_ctx); - if (maildir_sync_index(ctx) < 0) - return -1; + if (maildir_uidlist_sync_finish(ctx->uidlist_sync_ctx)) { + if (maildir_sync_index(ctx) < 0) + return -1; + } ret = maildir_uidlist_sync_deinit(ctx->uidlist_sync_ctx); ctx->uidlist_sync_ctx = NULL; diff --git a/src/lib-storage/index/maildir/maildir-uidlist.c b/src/lib-storage/index/maildir/maildir-uidlist.c index 1a7a9a6f51..30122d9da8 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.c +++ b/src/lib-storage/index/maildir/maildir-uidlist.c @@ -215,7 +215,7 @@ static int maildir_uidlist_next(struct maildir_uidlist *uidlist, rec = p_new(uidlist->record_pool, struct maildir_uidlist_rec, 1); rec->uid = uid; - rec->flags = flags; + rec->flags = flags | MAILDIR_UIDLIST_REC_FLAG_NONSYNCED; rec->filename = p_strdup(uidlist->record_pool, line); hash_insert(uidlist->files, rec->filename, rec); buffer_append(uidlist->record_buf, &rec, sizeof(rec)); @@ -767,7 +767,7 @@ static void maildir_uidlist_swap(struct maildir_uidlist_sync_ctx *ctx) } } -void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx) +int maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx) { if (!ctx->partial) { if (!ctx->failed && !ctx->locked) @@ -777,9 +777,9 @@ void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx) maildir_uidlist_assign_uids(ctx->uidlist, ctx->first_new_pos); } - maildir_uidlist_mark_all(ctx->uidlist, FALSE); } ctx->finished = TRUE; + return !ctx->locked; } int maildir_uidlist_sync_deinit(struct maildir_uidlist_sync_ctx *ctx) @@ -792,6 +792,9 @@ int maildir_uidlist_sync_deinit(struct maildir_uidlist_sync_ctx *ctx) if (ctx->new_files_count != 0 && !ctx->failed && !ctx->locked) ret = maildir_uidlist_rewrite(ctx->uidlist); + if (ctx->partial) + maildir_uidlist_mark_all(ctx->uidlist, FALSE); + if (UIDLIST_IS_LOCKED(ctx->uidlist)) maildir_uidlist_unlock(ctx->uidlist); diff --git a/src/lib-storage/index/maildir/maildir-uidlist.h b/src/lib-storage/index/maildir/maildir-uidlist.h index 4a3a7f174e..3ca1f587e7 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.h +++ b/src/lib-storage/index/maildir/maildir-uidlist.h @@ -37,7 +37,8 @@ int maildir_uidlist_sync_next_pre(struct maildir_uidlist_sync_ctx *ctx, int maildir_uidlist_sync_next(struct maildir_uidlist_sync_ctx *ctx, const char *filename, enum maildir_uidlist_rec_flag flags); -void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx); +/* Returns 1 = ok, 0 = uidlist is locked, don't try syncing any further */ +int maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx); int maildir_uidlist_sync_deinit(struct maildir_uidlist_sync_ctx *ctx); /* List all maildir files. */ -- 2.47.3