changeset 8874:6cc8ee6080ed HEAD

Write to main index file less often.
author Timo Sirainen <tss@iki.fi>
date Mon, 30 Mar 2009 16:18:25 -0400
parents a514df3e20db
children 629004d13ec4
files src/lib-index/mail-index-private.h src/lib-index/mail-index-sync-update.c src/lib-index/mail-index-sync.c
diffstat 3 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-private.h	Mon Mar 30 17:26:40 2009 -0400
+++ b/src/lib-index/mail-index-private.h	Mon Mar 30 16:18:25 2009 -0400
@@ -22,6 +22,11 @@
    try to catch them by limiting the header size. */
 #define MAIL_INDEX_EXT_HEADER_MAX_SIZE (1024*1024*16-1)
 
+/* Write to main index file when bytes-to-be-read-from-log is between these
+   values. */
+#define MAIL_INDEX_MIN_WRITE_BYTES (1024*8)
+#define MAIL_INDEX_MAX_WRITE_BYTES (1024*128)
+
 #define MAIL_INDEX_IS_IN_MEMORY(index) \
 	((index)->dir == NULL)
 
@@ -226,6 +231,7 @@
 	unsigned int mapping:1;
 	unsigned int syncing:1;
 	unsigned int need_recreate:1;
+	unsigned int index_min_write:1;
 	unsigned int modseqs_enabled:1;
 	unsigned int initial_create:1;
 	unsigned int initial_mapped:1;
--- a/src/lib-index/mail-index-sync-update.c	Mon Mar 30 17:26:40 2009 -0400
+++ b/src/lib-index/mail-index-sync-update.c	Mon Mar 30 16:18:25 2009 -0400
@@ -786,6 +786,15 @@
 		return 0;
 	}
 
+	mail_transaction_log_get_head(index->log, &prev_seq, &prev_offset);
+	if (prev_seq != map->hdr.log_file_seq ||
+	    prev_offset - map->hdr.log_file_tail_offset >
+	    				MAIL_INDEX_MIN_WRITE_BYTES) {
+		/* we're reading more from log than we would have preferred.
+		   remember that we probably want to rewrite index soon. */
+		index->index_min_write = TRUE;
+	}
+
 	/* view referenced the map. avoid unnecessary map cloning by
 	   unreferencing the map while view exists. */
 	map->refcount--;
--- a/src/lib-index/mail-index-sync.c	Mon Mar 30 17:26:40 2009 -0400
+++ b/src/lib-index/mail-index-sync.c	Mon Mar 30 16:18:25 2009 -0400
@@ -710,7 +710,8 @@
 
 	log_diff = index->map->hdr.log_file_tail_offset -
 		index->last_read_log_file_tail_offset;
-	if (log_diff > 1024)
+	if (log_diff > MAIL_INDEX_MAX_WRITE_BYTES ||
+	    (index->index_min_write && log_diff > MAIL_INDEX_MIN_WRITE_BYTES))
 		return TRUE;
 
 	if (index->need_recreate)
@@ -760,6 +761,7 @@
 	if (ret == 0 &&
 	    (want_rotate || mail_index_sync_want_index_write(index))) {
 		index->need_recreate = FALSE;
+		index->index_min_write = FALSE;
 		mail_index_write(index, want_rotate);
 	}
 	mail_index_sync_end(_ctx);