dovecot-2.1: lib-index: Optimize cache file reads with MAIL_INDE...

dovecot at dovecot.org dovecot at dovecot.org
Fri Oct 26 11:43:15 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/0efb98659a1f
changeset: 14787:0efb98659a1f
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Oct 26 11:43:05 2012 +0300
description:
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY

diffstat:

 src/lib-index/mail-cache-fields.c |  2 +-
 src/lib-index/mail-cache.c        |  9 +++++++++
 2 files changed, 10 insertions(+), 1 deletions(-)

diffs (38 lines):

diff -r 3700fb6f8a42 -r 0efb98659a1f src/lib-index/mail-cache-fields.c
--- a/src/lib-index/mail-cache-fields.c	Fri Oct 26 11:37:07 2012 +0300
+++ b/src/lib-index/mail-cache-fields.c	Fri Oct 26 11:43:05 2012 +0300
@@ -232,7 +232,7 @@
 		offset = next_offset;
 		invalidate = TRUE;
 
-		if (cache->mmap_base != NULL) {
+		if (cache->mmap_base != NULL || cache->map_with_read) {
 			ret = mail_cache_map(cache, offset, sizeof(*field_hdr),
 					     &data);
 			if (ret <= 0) {
diff -r 3700fb6f8a42 -r 0efb98659a1f src/lib-index/mail-cache.c
--- a/src/lib-index/mail-cache.c	Fri Oct 26 11:37:07 2012 +0300
+++ b/src/lib-index/mail-cache.c	Fri Oct 26 11:43:05 2012 +0300
@@ -13,6 +13,8 @@
 
 #include <unistd.h>
 
+#define MAIL_CACHE_MIN_HEADER_READ_SIZE 4096
+
 void mail_cache_set_syscall_error(struct mail_cache *cache,
 				  const char *function)
 {
@@ -321,6 +323,13 @@
 	} else {
 		buffer_set_used_size(cache->read_buf, 0);
 	}
+	if (offset == 0 && size < MAIL_CACHE_MIN_HEADER_READ_SIZE) {
+		/* we can usually read the fields header after the cache
+		   header. we need them both, so try to read them all with one
+		   pread() call. */
+		size = MAIL_CACHE_MIN_HEADER_READ_SIZE;
+	}
+
 	data = buffer_append_space_unsafe(cache->read_buf, size);
 	ret = pread(cache->fd, data, size, offset);
 	if (ret < 0) {


More information about the dovecot-cvs mailing list