From: Timo Sirainen Date: Thu, 11 Sep 2008 14:10:46 +0000 (+0300) Subject: Mail cache: If locking failed, the next time try to lock it only once. X-Git-Tag: 1.2.alpha2~58 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=763f83d3cc47bce05cbc396419c4db2b71dd8e68;p=thirdparty%2Fdovecot%2Fcore.git Mail cache: If locking failed, the next time try to lock it only once. Also increased the first timeout to 10 seconds. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-cache-private.h b/src/lib-index/mail-cache-private.h index aa40c86a45..4ea905079b 100644 --- a/src/lib-index/mail-cache-private.h +++ b/src/lib-index/mail-cache-private.h @@ -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 @@ struct mail_cache { 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; diff --git a/src/lib-index/mail-cache.c b/src/lib-index/mail-cache.c index e7fdf58568..6eb9ff1ff7 100644 --- a/src/lib-index/mail-cache.c +++ b/src/lib-index/mail-cache.c @@ -464,6 +464,12 @@ static int mail_cache_lock_file(struct mail_cache *cache, bool nonblock) { 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 @@ static int mail_cache_lock_file(struct mail_cache *cache, bool nonblock) "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