changeset 8190:9902de77194e HEAD

Mail cache: If locking failed, the next time try to lock it only once. Also increased the first timeout to 10 seconds.
author Timo Sirainen <tss@iki.fi>
date Thu, 11 Sep 2008 17:10:46 +0300
parents 7528e7256a1a
children f14e68845b6b
files src/lib-index/mail-cache-private.h src/lib-index/mail-cache.c
diffstat 2 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-cache-private.h	Thu Sep 11 17:06:29 2008 +0300
+++ b/src/lib-index/mail-cache-private.h	Thu Sep 11 17:10:46 2008 +0300
@@ -36,7 +36,7 @@
 /* When allocating space for transactions, don't use blocks larger than this. */
 #define MAIL_CACHE_MAX_RESERVED_BLOCK_SIZE (1024*512)
 
-#define MAIL_CACHE_LOCK_TIMEOUT 2
+#define MAIL_CACHE_LOCK_TIMEOUT 10
 #define MAIL_CACHE_LOCK_CHANGE_TIMEOUT 300
 
 #define CACHE_RECORD(cache, offset) \
@@ -171,6 +171,7 @@
 
 	unsigned int opened:1;
 	unsigned int locked:1;
+	unsigned int last_lock_failed:1;
 	unsigned int hdr_modified:1;
 	unsigned int field_header_write_pending:1;
 	unsigned int compressing:1;
--- a/src/lib-index/mail-cache.c	Thu Sep 11 17:06:29 2008 +0300
+++ b/src/lib-index/mail-cache.c	Thu Sep 11 17:10:46 2008 +0300
@@ -464,6 +464,12 @@
 {
 	int ret;
 
+	if (cache->last_lock_failed) {
+		/* previous locking failed. don't waste time waiting on it
+		   again, just try once to see if it's available now. */
+		nonblock = TRUE;
+	}
+
 	if (cache->index->lock_method != FILE_LOCK_METHOD_DOTLOCK) {
 		i_assert(cache->file_lock == NULL);
 		ret = mail_index_lock_fd(cache->index, cache->filepath,
@@ -483,6 +489,7 @@
 						     "file_dotlock_create()");
 		}
 	}
+	cache->last_lock_failed = ret <= 0;
 
 	/* don't bother warning if locking failed due to a timeout. since cache
 	   updating isn't all that important we're using a very short timeout