diff options
author | Grazvydas Ignotas <[email protected]> | 2017-03-15 20:53:56 +0200 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2017-03-16 09:36:18 +1100 |
commit | eb5a61f77a551e98b35bd9f4de3e44ed6c98dd1f (patch) | |
tree | 464d27edba910ba5058a5db33f1adeb054a6f1a8 /src | |
parent | a7ce0490e42b056dc20e13af795ca3e4cb73ed52 (diff) |
util/disk_cache: do eviction before creating .tmp
cache_put() first creates a .tmp file and then tries to do eviction.
The recently added LRU eviction code selects non-empty directory with
the oldest access time, but that may easily be the one with just the
new .tmp file, especially on Linux where atime is updated lazily
(with "relatime" mount option, which is the default). So when cache is
small, if random doesn't hit another dir LRU keeps selecting the same
dir with just the .tmp and not deleting anything. To fix this (and the
tests), do eviction earlier.
Signed-off-by: Grazvydas Ignotas <[email protected]>
Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/util/disk_cache.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index e015e56f5e2..30756bc4284 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -812,6 +812,13 @@ cache_put(void *job, int thread_index) if (filename == NULL) goto done; + /* If the cache is too large, evict something else first. */ + while (*dc_job->cache->size + dc_job->size > dc_job->cache->max_size && + i < 8) { + evict_lru_item(dc_job->cache); + i++; + } + /* Write to a temporary file to allow for an atomic rename to the * final destination filename, (to prevent any readers from seeing * a partially written file). @@ -856,16 +863,7 @@ cache_put(void *job, int thread_index) * not in the cache, and is also not being written out to the cache * by some other process. * - * Before we do that, if the cache is too large, evict something - * else first. - */ - while ((*dc_job->cache->size + dc_job->size > dc_job->cache->max_size) && - i < 8) { - evict_lru_item(dc_job->cache); - i++; - } - - /* Create CRC of the data and store at the start of the file. We will + * Create CRC of the data and store at the start of the file. We will * read this when restoring the cache and use it to check for corruption. */ struct cache_entry_file_data cf_data; |