dovecot-1.2: Recreate dovecot-uidlist if updating it would shrin...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Jul 20 15:45:43 EEST 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/cb2650c20a58
changeset: 8014:cb2650c20a58
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 7513ad244f0f -r cb2650c20a58 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
@@ -1022,6 +1022,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) {
@@ -1101,6 +1102,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) {
@@ -1155,10 +1157,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;
@@ -1168,10 +1179,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)
@@ -1570,7 +1578,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