]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Write to main index file less often.
authorTimo Sirainen <tss@iki.fi>
Mon, 30 Mar 2009 20:18:25 +0000 (16:18 -0400)
committerTimo Sirainen <tss@iki.fi>
Mon, 30 Mar 2009 20:18:25 +0000 (16:18 -0400)
--HG--
branch : HEAD

src/lib-index/mail-index-private.h
src/lib-index/mail-index-sync-update.c
src/lib-index/mail-index-sync.c

index fb0a8b242adc819eca953f408ccdf58654215bbf..f1a9f6b770284efb2a4187a76a24429400b44e58 100644 (file)
@@ -22,6 +22,11 @@ struct mail_index_sync_map_ctx;
    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 @@ struct mail_index {
        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;
index d82613d3523e3262cd80e9540f45d1e19aa1ce21..6cb1f86b7b6d8dcbcd89e406fc15e50a5cf92c7f 100644 (file)
@@ -786,6 +786,15 @@ int mail_index_sync_map(struct mail_index_map **_map,
                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--;
index 131b0207a63bc7ce8f85bdccd8d190c44cf9edc8..725d672cd49a218bef1ab0b7b594903f6eae4695 100644 (file)
@@ -710,7 +710,8 @@ static bool mail_index_sync_want_index_write(struct mail_index *index)
 
        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 @@ int mail_index_sync_commit(struct mail_index_sync_ctx **_ctx)
        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);