changeset 1988:739b469b99e2 HEAD

syncing fixes
author Timo Sirainen <tss@iki.fi>
date Mon, 10 May 2004 02:52:13 +0300
parents 3b1f8ed213ca
children a2b009c65e02
files 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
diffstat 4 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-view-sync.c	Mon May 10 02:32:43 2004 +0300
+++ b/src/lib-index/mail-index-view-sync.c	Mon May 10 02:52:13 2004 +0300
@@ -353,6 +353,7 @@
 
 	mail_index_unmap(view->index, view->map);
 	view->map = ctx->sync_map;
+	view->map_protected = FALSE;
 
         mail_transaction_log_view_unset(view->log_view);
 
--- a/src/lib-storage/index/maildir/maildir-sync.c	Mon May 10 02:32:43 2004 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync.c	Mon May 10 02:52:13 2004 +0300
@@ -559,7 +559,8 @@
 				   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 @@
 	}
 
 	/* 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;
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Mon May 10 02:32:43 2004 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Mon May 10 02:52:13 2004 +0300
@@ -215,7 +215,7 @@
 
 	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 @@
 	}
 }
 
-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 @@
 			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 @@
 	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);
 
--- a/src/lib-storage/index/maildir/maildir-uidlist.h	Mon May 10 02:32:43 2004 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.h	Mon May 10 02:52:13 2004 +0300
@@ -37,7 +37,8 @@
 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. */