Mesa (master): util/disk_cache: actually enforce cache size

Timothy Arceri tarceri at kemper.freedesktop.org
Wed Mar 15 00:35:15 UTC 2017


Module: Mesa
Branch: master
Commit: f1e96714424f516ec3ee7a341fb10068340b0411
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f1e96714424f516ec3ee7a341fb10068340b0411

Author: Alan Swanson <reiver at improbability.net>
Date:   Mon Mar  6 16:17:31 2017 +0000

util/disk_cache: actually enforce cache size

Currently only a one in one out eviction so if at max_size and
cache files were to constantly increase in size then so would the
cache. Restrict to limit of 8 evictions per new cache entry.

V2: (Timothy Arceri) fix make check tests

Reviewed-by: Grazvydas Ignotas <notasas at gmail.com>

---

 src/compiler/glsl/tests/cache_test.c | 22 +++++++++++++++++++---
 src/util/disk_cache.c                |  6 +++++-
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/compiler/glsl/tests/cache_test.c b/src/compiler/glsl/tests/cache_test.c
index 61ee630..832693e 100644
--- a/src/compiler/glsl/tests/cache_test.c
+++ b/src/compiler/glsl/tests/cache_test.c
@@ -350,9 +350,10 @@ test_put_and_get(void)
 
    free(result);
 
-   /* Ensure eviction happened by checking that only one of the two
-    * previously-added items can still be fetched.
+   /* Ensure eviction happened by checking that both of the previous
+    * cache itesm were evicted.
     */
+   bool contains_1KB_file = false;
    count = 0;
    if (does_cache_contain(cache, blob_key))
        count++;
@@ -360,6 +361,13 @@ test_put_and_get(void)
    if (does_cache_contain(cache, string_key))
        count++;
 
+   if (does_cache_contain(cache, one_KB_key)) {
+      count++;
+      contains_1KB_file = true;
+   }
+
+   expect_true(contains_1KB_file,
+               "disk_cache_put eviction last file == MAX_SIZE (1KB)");
    expect_equal(count, 1, "disk_cache_put eviction with MAX_SIZE=1K");
 
    /* Now increase the size to 1M, add back both items, and ensure all
@@ -406,6 +414,7 @@ test_put_and_get(void)
     */
    wait_until_file_written(cache, one_MB_key);
 
+   bool contains_1MB_file = false;
    count = 0;
    if (does_cache_contain(cache, blob_key))
        count++;
@@ -416,7 +425,14 @@ test_put_and_get(void)
    if (does_cache_contain(cache, one_KB_key))
        count++;
 
-   expect_equal(count, 2, "eviction after overflow with MAX_SIZE=1M");
+   if (does_cache_contain(cache, one_MB_key)) {
+      count++;
+      contains_1MB_file = true;
+   }
+
+   expect_true(contains_1MB_file,
+               "disk_cache_put eviction last file == MAX_SIZE (1MB)");
+   expect_equal(count, 1, "eviction after overflow with MAX_SIZE=1M");
 
    disk_cache_destroy(cache);
 }
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 931e308..5413444 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -798,6 +798,7 @@ cache_put(void *job, int thread_index)
    assert(job);
 
    int fd = -1, fd_final = -1, err, ret;
+   unsigned i = 0;
    size_t len;
    char *filename = NULL, *filename_tmp = NULL;
    struct disk_cache_put_job *dc_job = (struct disk_cache_put_job *) job;
@@ -853,8 +854,11 @@ cache_put(void *job, int thread_index)
     * Before we do that, if the cache is too large, evict something
     * else first.
     */
-   if (*dc_job->cache->size + dc_job->size > dc_job->cache->max_size)
+   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
     * read this when restoring the cache and use it to check for corruption.




More information about the mesa-commit mailing list