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