changeset 7271:4ac4e9ba1124 HEAD

Make sure we don't use a stale first_unwritten_pos to optimize dovecot-uidlist writing.
author Timo Sirainen <tss@iki.fi>
date Thu, 21 Feb 2008 13:06:50 +0200
parents c6afa177bbf1
children 1e5deb36a79f
files src/lib-storage/index/maildir/maildir-uidlist.c
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Wed Feb 20 20:39:07 2008 +0200
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Thu Feb 21 13:06:50 2008 +0200
@@ -103,6 +103,7 @@
 
 	unsigned int first_unwritten_pos, first_nouid_pos;
 	unsigned int new_files_count;
+	unsigned int finish_change_counter;
 
 	unsigned int partial:1;
 	unsigned int finished:1;
@@ -931,6 +932,7 @@
 	}
 
 	iter = maildir_uidlist_iter_init(uidlist);
+	i_assert(first_idx <= array_count(&uidlist->records));
 	iter->next += first_idx;
 
 	while (maildir_uidlist_iter_next_rec(iter, &rec)) {
@@ -1080,6 +1082,7 @@
 
 	if (ctx->uidlist->recreate || uidlist->fd == -1 ||
 	    uidlist->version != 3 ||
+	    ctx->finish_change_counter != ctx->uidlist->change_counter ||
 	    (uidlist->read_records_count + ctx->new_files_count) *
 	    UIDLIST_COMPRESS_PERCENTAGE / 100 >= array_count(&uidlist->records))
 		return maildir_uidlist_recreate(uidlist);
@@ -1381,6 +1384,7 @@
 
         ctx->uidlist->last_seen_uid = ctx->uidlist->next_uid-1;
 	ctx->uidlist->change_counter++;
+	ctx->finish_change_counter = ctx->uidlist->change_counter;
 }
 
 static void maildir_uidlist_swap(struct maildir_uidlist_sync_ctx *ctx)
@@ -1409,9 +1413,9 @@
 	if (ctx->new_files_count != 0) {
 		ctx->first_nouid_pos = count - ctx->new_files_count;
 		maildir_uidlist_assign_uids(ctx);
+	} else {
+		ctx->uidlist->change_counter++;
 	}
-
-	ctx->uidlist->change_counter++;
 }
 
 void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx)