]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
syncing fixes
authorTimo Sirainen <tss@iki.fi>
Sun, 9 May 2004 23:52:13 +0000 (02:52 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 9 May 2004 23:52:13 +0000 (02:52 +0300)
--HG--
branch : HEAD

src/lib-index/mail-index-view-sync.c
src/lib-storage/index/maildir/maildir-sync.c
src/lib-storage/index/maildir/maildir-uidlist.c
src/lib-storage/index/maildir/maildir-uidlist.h

index 9f02f8dde26d17d90e88b1f9a47894efd31ab995..69cce524ef0d85eb4632dddd80b418fd6003ce65 100644 (file)
@@ -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);
 
index fb97254c38559e0d20d399d14b2681401c67c1ed..54fdc2e20d15e98bbaa20a8343542d524ccbedd0 100644 (file)
@@ -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;
index 1a7a9a6f51e1c96f9d95c544a5f13bdce1af6660..30122d9da880379446f19f8554a7678024b61fa2 100644 (file)
@@ -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);
 
index 4a3a7f174e78a441c9ba7b26a0ac4d8589fa8235..3ca1f587e7497365472ffba749b27e64d6520d69 100644 (file)
@@ -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. */