dovecot-1.0: Recreate dovecot-uidlist if updating it would shrin...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Jun 18 03:26:41 EEST 2008
details: http://hg.dovecot.org/dovecot-1.0/rev/92c3d6e64f2a
changeset: 5556:92c3d6e64f2a
user: Timo Sirainen <tss at iki.fi>
date: Wed Jun 18 03:26:37 2008 +0300
description:
Recreate dovecot-uidlist if updating it would shrink the file more than 25%.
diffstat:
1 file changed, 18 insertions(+), 1 deletion(-)
src/lib-storage/index/maildir/maildir-uidlist.c | 19 ++++++++++++++++++-
diffs (71 lines):
diff -r b7a9e85e849e -r 92c3d6e64f2a src/lib-storage/index/maildir/maildir-uidlist.c
--- a/src/lib-storage/index/maildir/maildir-uidlist.c Fri Jun 13 03:53:37 2008 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c Wed Jun 18 03:26:37 2008 +0300
@@ -25,6 +25,8 @@
/* how many seconds to wait before overriding uidlist.lock */
#define UIDLIST_LOCK_STALE_TIMEOUT (60*2)
+#define UIDLIST_COMPRESS_PERCENTAGE 75
+
#define UIDLIST_IS_LOCKED(uidlist) \
((uidlist)->lock_count > 0)
@@ -51,6 +53,7 @@ struct maildir_uidlist {
unsigned int version;
unsigned int uid_validity, next_uid, prev_read_uid, last_seen_uid;
+ unsigned int read_records_count;
uint32_t first_recent_uid;
unsigned int initial_read:1;
@@ -433,9 +436,11 @@ maildir_uidlist_update_read(struct maild
orig_next_uid = uidlist->next_uid;
if ((ret = maildir_uidlist_read_header(uidlist, input)) > 0) {
uidlist->prev_read_uid = 0;
+ uidlist->read_records_count = 0;
ret = 1;
while ((line = i_stream_read_next_line(input)) != NULL) {
+ uidlist->read_records_count++;
if (!maildir_uidlist_next(uidlist, line)) {
ret = 0;
break;
@@ -695,10 +700,12 @@ static int maildir_uidlist_rewrite_fd(st
str_printfa(str, "%u %u %u\n", uidlist->version,
uidlist->uid_validity, uidlist->next_uid);
+ uidlist->read_records_count = 0;
iter = maildir_uidlist_iter_init(uidlist->mbox->uidlist);
while (maildir_uidlist_iter_next(iter, &uid, &flags, &filename)) {
/* avoid overflowing str buffer so we don't eat more memory
than we need. */
+ uidlist->read_records_count++;
if (str_len(str) + MAX_INT_STRLEN +
strlen(filename) + 5 + 10 >= 4096) {
/* flush buffer */
@@ -1071,6 +1078,16 @@ void maildir_uidlist_sync_finish(struct
ctx->uidlist->initial_sync = TRUE;
}
+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 *
+ UIDLIST_COMPRESS_PERCENTAGE / 100;
+ return min_rewrite_count >= ctx->uidlist->record_buf->used /
+ sizeof(struct maildir_uidlist_rec *);
+}
+
int maildir_uidlist_sync_deinit(struct maildir_uidlist_sync_ctx **_ctx)
{
struct maildir_uidlist_sync_ctx *ctx = *_ctx;
@@ -1085,7 +1102,7 @@ int maildir_uidlist_sync_deinit(struct m
if (ctx->partial)
maildir_uidlist_mark_all(ctx->uidlist, FALSE);
- if (ctx->uidlist->need_rewrite ||
+ if (ctx->uidlist->need_rewrite || maildir_uidlist_want_compress(ctx) ||
(ctx->new_files_count != 0 && !ctx->failed)) {
unsigned int nonrecursive_lock_count = 1;
More information about the dovecot-cvs
mailing list