]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: If opening a cache file fails, try again later.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 19 Apr 2016 23:23:31 +0000 (02:23 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 20 Apr 2016 14:14:48 +0000 (17:14 +0300)
The previous code would never retry opening the cache file within the same
session.

src/lib-index/mail-cache-compress.c
src/lib-index/mail-cache.c

index 1e82fe2ffa5600b47c19839ee9a3fa79918a629f..cfc33de57c85e1d2684f1955db6c351bede2acb4 100644 (file)
@@ -363,6 +363,7 @@ mail_cache_compress_write(struct mail_cache *cache,
        }
 
        mail_cache_file_close(cache);
+       cache->opened = TRUE;
        cache->fd = fd;
        cache->st_ino = st.st_ino;
        cache->st_dev = st.st_dev;
index 53b45d58e32e7641bc8672d7f6ff48e311cb8c79..b5b4876b0eddb70e627b01cdcfdbb4c8fbdca4ae 100644 (file)
@@ -77,6 +77,7 @@ void mail_cache_file_close(struct mail_cache *cache)
                        mail_cache_set_syscall_error(cache, "close()");
                cache->fd = -1;
        }
+       cache->opened = FALSE;
 }
 
 static void mail_cache_init_file_cache(struct mail_cache *cache)
@@ -101,14 +102,17 @@ static int mail_cache_try_open(struct mail_cache *cache)
 {
        const void *data;
 
+       i_assert(!cache->opened);
        cache->opened = TRUE;
 
        if (MAIL_INDEX_IS_IN_MEMORY(cache->index))
                return 0;
 
+       i_assert(cache->fd == -1);
        cache->fd = nfs_safe_open(cache->filepath,
                                  cache->index->readonly ? O_RDONLY : O_RDWR);
        if (cache->fd == -1) {
+               mail_cache_file_close(cache);
                if (errno == ENOENT) {
                        cache->need_compress_file_seq = 0;
                        return 0;
@@ -120,8 +124,10 @@ static int mail_cache_try_open(struct mail_cache *cache)
 
        mail_cache_init_file_cache(cache);
 
-       if (mail_cache_map(cache, 0, 0, &data) < 0)
+       if (mail_cache_map(cache, 0, 0, &data) < 0) {
+               mail_cache_file_close(cache);
                return -1;
+       }
        return 1;
 }