dovecot-1.1: Recreate dovecot-uidlist if updating it would shrin...

dovecot at dovecot.org dovecot at dovecot.org
Wed Jun 18 03:19:03 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/dbdb33bf8893
changeset: 7677:dbdb33bf8893
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Jun 18 03:18:56 2008 +0300
description:
Recreate dovecot-uidlist if updating it would shrink the file more than 25%.

diffstat:

1 file changed, 15 insertions(+), 6 deletions(-)
src/lib-storage/index/maildir/maildir-uidlist.c |   21 +++++++++++++++------

diffs (62 lines):

diff -r 89d85ca00002 -r dbdb33bf8893 src/lib-storage/index/maildir/maildir-uidlist.c
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Wed Jun 18 03:05:17 2008 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Wed Jun 18 03:18:56 2008 +0300
@@ -1013,6 +1013,7 @@ static int maildir_uidlist_write_fd(stru
 	iter->next += first_idx;
 
 	while (maildir_uidlist_iter_next_rec(iter, &rec)) {
+		uidlist->read_records_count++;
 		str_truncate(str, 0);
 		str_printfa(str, "%u", rec->uid);
 		if (rec->extensions != NULL) {
@@ -1092,6 +1093,7 @@ static int maildir_uidlist_recreate(stru
 		}
 	}
 
+	uidlist->read_records_count = 0;
 	ret = maildir_uidlist_write_fd(uidlist, fd, temp_path, 0, &file_size);
 	if (ret == 0) {
 		if (rename(temp_path, uidlist->path) < 0) {
@@ -1146,10 +1148,19 @@ int maildir_uidlist_update(struct maildi
 	return ret;
 }
 
+static bool maildir_uidlist_want_compress(struct maildir_uidlist_sync_ctx *ctx)
+{
+	unsigned int min_rewrite_count;
+
+	min_rewrite_count =
+		(ctx->uidlist->read_records_count + ctx->new_files_count) *
+		UIDLIST_COMPRESS_PERCENTAGE / 100;
+	return min_rewrite_count >= array_count(&ctx->uidlist->records);
+}
+
 static bool maildir_uidlist_want_recreate(struct maildir_uidlist_sync_ctx *ctx)
 {
 	struct maildir_uidlist *uidlist = ctx->uidlist;
-	unsigned int min_rewrite_count;
 
 	if (!uidlist->initial_read)
 		return FALSE;
@@ -1159,10 +1170,7 @@ static bool maildir_uidlist_want_recreat
 	    ctx->finish_change_counter != uidlist->change_counter)
 		return TRUE;
 
-	min_rewrite_count =
-		(uidlist->read_records_count + ctx->new_files_count) *
-		UIDLIST_COMPRESS_PERCENTAGE / 100;
-	return min_rewrite_count >= array_count(&uidlist->records);
+	return maildir_uidlist_want_compress(ctx);
 }
 
 static int maildir_uidlist_sync_update(struct maildir_uidlist_sync_ctx *ctx)
@@ -1552,7 +1560,8 @@ void maildir_uidlist_sync_finish(struct 
 	ctx->uidlist->initial_sync = TRUE;
 
 	i_assert(ctx->locked || !ctx->changed);
-	if ((ctx->changed || ctx->uidlist->recreate) &&
+	if ((ctx->changed || ctx->uidlist->recreate ||
+	     maildir_uidlist_want_compress(ctx)) &&
 	    !ctx->failed && ctx->locked) T_BEGIN {
 		if (maildir_uidlist_sync_update(ctx) < 0)
 			ctx->failed = TRUE;


More information about the dovecot-cvs mailing list