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;