Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3909:411f20e72a8f HEAD
Added mail_cache_min_mail_count setting.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 19 Jan 2006 00:16:40 +0200 |
parents | afe21b6d4b68 |
children | 3b0f9be42126 |
files | dovecot-example.conf src/lib-storage/index/index-mail-headers.c src/lib-storage/index/index-mail.c src/lib-storage/index/index-mail.h src/lib-storage/index/index-storage.c src/lib-storage/index/index-storage.h src/lib-storage/index/maildir/maildir-mail.c src/lib-storage/index/mbox/mbox-mail.c src/master/mail-process.c src/master/master-settings.c src/master/master-settings.h |
diffstat | 11 files changed, 68 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/dovecot-example.conf Wed Jan 18 18:53:20 2006 +0200 +++ b/dovecot-example.conf Thu Jan 19 00:16:40 2006 +0200 @@ -277,6 +277,11 @@ # needed. #mail_never_cache_fields = +# The minimum number of mails in a mailbox before updates are done to cache +# file. This allows optimizing Dovecot's behavior to do less disk writes at +# the cost of more disk reads. +#mail_cache_min_mail_count = 0 + # When IDLE command is running, mailbox is checked once in a while to see if # there are any new mails or other changes. This setting defines the minimum # time to wait between those checks. Dovecot is however able to use dnotify
--- a/src/lib-storage/index/index-mail-headers.c Wed Jan 18 18:53:20 2006 +0200 +++ b/src/lib-storage/index/index-mail-headers.c Thu Jan 19 00:16:40 2006 +0200 @@ -72,9 +72,7 @@ mail->data.seq, match_idx) == 0) { /* this header doesn't exist. remember that. */ - mail_cache_add(mail->trans->cache_trans, - mail->data.seq, match_idx, - NULL, 0); + index_mail_cache_add(mail, match_idx, NULL, 0); } match_idx++; } @@ -123,8 +121,7 @@ } data = buffer_get_data(buf, &data_size); - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - lines[i].field_idx, data, data_size); + index_mail_cache_add(mail, lines[i].field_idx, data, data_size); } for (; match_idx < match_count; match_idx++) { @@ -132,8 +129,7 @@ mail_cache_field_exists(mail->trans->cache_view, mail->data.seq, match_idx) == 0) { /* this header doesn't exist. remember that. */ - mail_cache_add(mail->trans->cache_trans, - mail->data.seq, match_idx, NULL, 0); + index_mail_cache_add(mail, match_idx, NULL, 0); } } @@ -152,10 +148,8 @@ /* check that it hadn't been added in some older session */ if (mail_cache_field_exists(mail->trans->cache_view, - mail->data.seq, cache_field) == 0) { - mail_cache_add(mail->trans->cache_trans, - mail->data.seq, cache_field, NULL, 0); - } + mail->data.seq, cache_field) == 0) + index_mail_cache_add(mail, cache_field, NULL, 0); } t_pop(); } @@ -244,8 +238,8 @@ imap_envelope_write_part_data(mail->data.envelope_data, str); mail->data.envelope = str_c(str); - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - MAIL_CACHE_IMAP_ENVELOPE, str_data(str), str_len(str)); + index_mail_cache_add(mail, MAIL_CACHE_IMAP_ENVELOPE, + str_data(str), str_len(str)); } void index_mail_parse_header(struct message_part *part, @@ -276,9 +270,9 @@ if (hdr == NULL) { /* end of headers */ if (data->sent_date.time != (time_t)-1) { - mail_cache_add(mail->trans->cache_trans, data->seq, - MAIL_CACHE_SENT_DATE, &data->sent_date, - sizeof(data->sent_date)); + index_mail_cache_add(mail, MAIL_CACHE_SENT_DATE, + &data->sent_date, + sizeof(data->sent_date)); } index_mail_parse_header_finish(mail); data->save_bodystructure_header = FALSE;
--- a/src/lib-storage/index/index-mail.c Wed Jan 18 18:53:20 2006 +0200 +++ b/src/lib-storage/index/index-mail.c Thu Jan 19 00:16:40 2006 +0200 @@ -260,9 +260,9 @@ tz = 0; } data->sent_date.timezone = tz; - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - cache_fields[MAIL_CACHE_SENT_DATE].idx, - &data->sent_date, sizeof(data->sent_date)); + index_mail_cache_add(mail, + cache_fields[MAIL_CACHE_SENT_DATE].idx, + &data->sent_date, sizeof(data->sent_date)); } if (timezone != NULL) @@ -311,9 +311,9 @@ } i_assert(data->virtual_size != (uoff_t)-1); - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - cache_fields[MAIL_CACHE_VIRTUAL_FULL_SIZE].idx, - &data->virtual_size, sizeof(data->virtual_size)); + index_mail_cache_add(mail, + cache_fields[MAIL_CACHE_VIRTUAL_FULL_SIZE].idx, + &data->virtual_size, sizeof(data->virtual_size)); return data->virtual_size; } @@ -335,6 +335,21 @@ return (uoff_t)-1; } +void index_mail_cache_add(struct index_mail *mail, unsigned int field, + const void *data, size_t data_size) +{ + const struct mail_index_header *hdr; + + /* First check if we've configured caching not to be used with + low enough message count. */ + hdr = mail_index_get_header(mail->ibox->view); + if (hdr->messages_count < mail->ibox->mail_cache_min_mail_count) + return; + + mail_cache_add(mail->trans->cache_trans, mail->data.seq, + field, data, data_size); +} + static void parse_bodystructure_part_header(struct message_part *part, struct message_header_line *hdr, void *context) @@ -412,9 +427,8 @@ if (cache_flags != data->cache_flags) { data->cache_flags = cache_flags; - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - cache_fields[MAIL_CACHE_FLAGS].idx, - &cache_flags, sizeof(cache_flags)); + index_mail_cache_add(mail, cache_fields[MAIL_CACHE_FLAGS].idx, + &cache_flags, sizeof(cache_flags)); } /* see if we want to cache the message part */ @@ -432,9 +446,9 @@ message_part_serialize(mail->data.parts, buffer); buf_data = buffer_get_data(buffer, &buf_size); - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - cache_fields[MAIL_CACHE_MESSAGEPART].idx, - buf_data, buf_size); + index_mail_cache_add(mail, + cache_fields[MAIL_CACHE_MESSAGEPART].idx, + buf_data, buf_size); t_pop(); data->messageparts_saved_to_cache = TRUE; } @@ -548,7 +562,7 @@ if (!plain_bodystructure && dec != (MAIL_CACHE_DECISION_NO | MAIL_CACHE_DECISION_FORCED)) { - mail_cache_add(mail->trans->cache_trans, data->seq, + index_mail_cache_add(mail, cache_fields[MAIL_CACHE_IMAP_BODYSTRUCTURE].idx, str_c(str), str_len(str)+1); bodystructure_cached = TRUE; @@ -568,7 +582,7 @@ if (!bodystructure_cached && !plain_bodystructure && dec != (MAIL_CACHE_DECISION_NO | MAIL_CACHE_DECISION_FORCED)) { - mail_cache_add(mail->trans->cache_trans, data->seq, + index_mail_cache_add(mail, cache_fields[MAIL_CACHE_IMAP_BODY].idx, str_c(str), str_len(str)+1); }
--- a/src/lib-storage/index/index-mail.h Wed Jan 18 18:53:20 2006 +0200 +++ b/src/lib-storage/index/index-mail.h Thu Jan 19 00:16:40 2006 +0200 @@ -172,4 +172,7 @@ uoff_t index_mail_get_cached_virtual_size(struct index_mail *mail); time_t index_mail_get_cached_received_date(struct index_mail *mail); +void index_mail_cache_add(struct index_mail *mail, unsigned int field, + const void *data, size_t data_size); + #endif
--- a/src/lib-storage/index/index-storage.c Wed Jan 18 18:53:20 2006 +0200 +++ b/src/lib-storage/index/index-storage.c Thu Jan 19 00:16:40 2006 +0200 @@ -225,7 +225,7 @@ { static bool initialized = FALSE; struct mail_cache *cache = ibox->cache; - const char *cache_env, *never_env; + const char *cache_env, *never_env, *env; if (!initialized) { initialized = TRUE; @@ -242,6 +242,10 @@ set_cache_decisions("mail_never_cache_fields", never_env, MAIL_CACHE_DECISION_NO | MAIL_CACHE_DECISION_FORCED); + + env = getenv("MAIL_CACHE_MIN_MAIL_COUNT"); + if (env != NULL) + ibox->mail_cache_min_mail_count = atoi(env); } ibox->cache_fields = i_malloc(sizeof(global_cache_fields));
--- a/src/lib-storage/index/index-storage.h Wed Jan 18 18:53:20 2006 +0200 +++ b/src/lib-storage/index/index-storage.h Thu Jan 19 00:16:40 2006 +0200 @@ -64,8 +64,11 @@ const array_t *ARRAY_DEFINE_PTR(keyword_names, const char *); struct mail_cache_field *cache_fields; + unsigned int mail_cache_min_mail_count; + buffer_t *recent_flags; uint32_t recent_flags_start_seq, recent_flags_count; + uint32_t synced_recent_count; time_t sync_last_check;
--- a/src/lib-storage/index/maildir/maildir-mail.c Wed Jan 18 18:53:20 2006 +0200 +++ b/src/lib-storage/index/maildir/maildir-mail.c Thu Jan 19 00:16:40 2006 +0200 @@ -99,9 +99,8 @@ } data->received_date = st.st_mtime; - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - MAIL_CACHE_RECEIVED_DATE, - &data->received_date, sizeof(data->received_date)); + index_mail_cache_add(mail, MAIL_CACHE_RECEIVED_DATE, + &data->received_date, sizeof(data->received_date)); return data->received_date; } @@ -140,9 +139,9 @@ if (*p == MAILDIR_INFO_SEP || *p == MAILDIR_EXTRA_SEP || *p == '\0') { - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - MAIL_CACHE_VIRTUAL_FULL_SIZE, - &virtual_size, sizeof(virtual_size)); + index_mail_cache_add(mail, MAIL_CACHE_VIRTUAL_FULL_SIZE, + &virtual_size, + sizeof(virtual_size)); return virtual_size; } } @@ -209,8 +208,8 @@ size = st.st_size; } - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - MAIL_CACHE_PHYSICAL_FULL_SIZE, &size, sizeof(size)); + index_mail_cache_add(mail, MAIL_CACHE_PHYSICAL_FULL_SIZE, + &size, sizeof(size)); data->physical_size = size; return size;
--- a/src/lib-storage/index/mbox/mbox-mail.c Wed Jan 18 18:53:20 2006 +0200 +++ b/src/lib-storage/index/mbox/mbox-mail.c Thu Jan 19 00:16:40 2006 +0200 @@ -106,9 +106,8 @@ data->received_date = 0; } - mail_cache_add(mail->trans->cache_trans, mail->data.seq, - MAIL_CACHE_RECEIVED_DATE, - &data->received_date, sizeof(data->received_date)); + index_mail_cache_add(mail, MAIL_CACHE_RECEIVED_DATE, + &data->received_date, sizeof(data->received_date)); return data->received_date; }
--- a/src/master/mail-process.c Wed Jan 18 18:53:20 2006 +0200 +++ b/src/master/mail-process.c Thu Jan 19 00:16:40 2006 +0200 @@ -195,6 +195,8 @@ set->mail_cache_fields, NULL)); env_put(t_strconcat("MAIL_NEVER_CACHE_FIELDS=", set->mail_never_cache_fields, NULL)); + env_put(t_strdup_printf("MAIL_CACHE_MIN_MAIL_COUNT=%u", + set->mail_cache_min_mail_count)); env_put(t_strdup_printf("MAILBOX_IDLE_CHECK_INTERVAL=%u", set->mailbox_idle_check_interval)); env_put(t_strdup_printf("MAIL_MAX_KEYWORD_LENGTH=%u",
--- a/src/master/master-settings.c Wed Jan 18 18:53:20 2006 +0200 +++ b/src/master/master-settings.c Thu Jan 19 00:16:40 2006 +0200 @@ -102,6 +102,7 @@ DEF(SET_STR, default_mail_env), DEF(SET_STR, mail_cache_fields), DEF(SET_STR, mail_never_cache_fields), + DEF(SET_STR, mail_cache_min_mail_count), DEF(SET_INT, mailbox_idle_check_interval), DEF(SET_BOOL, mail_debug), DEF(SET_BOOL, mail_full_filesystem_access), @@ -298,6 +299,7 @@ MEMBER(default_mail_env) NULL, MEMBER(mail_cache_fields) "flags", MEMBER(mail_never_cache_fields) "imap.envelope", + MEMBER(mail_cache_min_mail_count) 0, MEMBER(mailbox_idle_check_interval) 30, MEMBER(mail_debug) FALSE, MEMBER(mail_full_filesystem_access) FALSE,
--- a/src/master/master-settings.h Wed Jan 18 18:53:20 2006 +0200 +++ b/src/master/master-settings.h Thu Jan 19 00:16:40 2006 +0200 @@ -67,6 +67,7 @@ const char *default_mail_env; const char *mail_cache_fields; const char *mail_never_cache_fields; + unsigned int mail_cache_min_mail_count; unsigned int mailbox_idle_check_interval; bool mail_debug; bool mail_full_filesystem_access;