From c92c99481fd008c3e77d942f0867c7d45fba24cd Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Mon, 24 Oct 2022 19:41:59 +0300 Subject: [PATCH] util/mesa-db: Support removal of cache entries Add support for removal of cache entries to mesa-db cache. This allows to have a more predictable unit tests by removing dummy entries that are added to cache when test-cache is created by unit-testing framework. Acked-by: Timothy Arceri Signed-off-by: Dmitry Osipenko Part-of: --- src/util/disk_cache.c | 5 ++++ src/util/mesa_cache_db.c | 57 +++++++++++++++++++++++++++++++++++++--- src/util/mesa_cache_db.h | 11 ++++++++ 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 8382efc360a..20331d64dff 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -335,6 +335,11 @@ disk_cache_wait_for_idle(struct disk_cache *cache) void disk_cache_remove(struct disk_cache *cache, const cache_key key) { + if (cache->type == DISK_CACHE_DATABASE) { + mesa_cache_db_entry_remove(&cache->cache_db, key); + return; + } + char *filename = disk_cache_get_cache_filename(cache, key); if (filename == NULL) { return; diff --git a/src/util/mesa_cache_db.c b/src/util/mesa_cache_db.c index 2da025b40c5..64b360a1c66 100644 --- a/src/util/mesa_cache_db.c +++ b/src/util/mesa_cache_db.c @@ -434,7 +434,8 @@ static uint32_t blob_file_size(uint32_t blob_size) } static bool -mesa_db_compact(struct mesa_cache_db *db, int64_t blob_size) +mesa_db_compact(struct mesa_cache_db *db, int64_t blob_size, + struct mesa_index_db_hash_entry *remove_entry) { uint32_t num_entries, buffer_size = sizeof(struct mesa_index_db_file_entry); struct mesa_db_file_header cache_header, index_header; @@ -446,7 +447,7 @@ mesa_db_compact(struct mesa_cache_db *db, int64_t blob_size) unsigned int i = 0; /* reload index to sync the last access times */ - if (!mesa_db_reload(db)) + if (!remove_entry && !mesa_db_reload(db)) return false; num_entries = _mesa_hash_table_num_entries(db->index_db->table); @@ -469,7 +470,7 @@ mesa_db_compact(struct mesa_cache_db *db, int64_t blob_size) hash_table_foreach(db->index_db->table, entry) { entries[i] = entry->data; - entries[i]->evicted = false; + entries[i]->evicted = (entries[i] == remove_entry); buffer_size = MAX2(buffer_size, blob_file_size(entries[i]->size)); i++; } @@ -759,7 +760,8 @@ mesa_cache_db_entry_write(struct mesa_cache_db *db, goto fail_fatal; if (!mesa_cache_db_has_space_locked(db, blob_size)) { - if (!mesa_db_compact(db, MAX2(blob_size, mesa_cache_db_eviction_size(db)))) + if (!mesa_db_compact(db, MAX2(blob_size, mesa_cache_db_eviction_size(db)), + NULL)) goto fail_fatal; } else { if (!mesa_db_update_index(db)) @@ -821,4 +823,51 @@ fail: return false; } +bool +mesa_cache_db_entry_remove(struct mesa_cache_db *db, + const uint8_t *cache_key_160bit) +{ + uint64_t hash = to_mesa_cache_db_hash(cache_key_160bit); + struct mesa_cache_db_file_entry cache_entry; + struct mesa_index_db_hash_entry *hash_entry; + + if (!mesa_db_lock(db)) + return NULL; + + if (!db->alive) + goto fail; + + if (mesa_db_uuid_changed(db) && !mesa_db_reload(db)) + goto fail_fatal; + + if (!mesa_db_update_index(db)) + goto fail_fatal; + + hash_entry = _mesa_hash_table_u64_search(db->index_db, hash); + if (!hash_entry) + goto fail; + + if (!mesa_db_seek(db->cache.file, hash_entry->cache_db_file_offset) || + !mesa_db_read(db->cache.file, &cache_entry) || + !mesa_db_cache_entry_valid(&cache_entry)) + goto fail_fatal; + + if (memcmp(cache_entry.key, cache_key_160bit, sizeof(cache_entry.key))) + goto fail; + + if (!mesa_db_compact(db, 0, hash_entry)) + goto fail_fatal; + + mesa_db_unlock(db); + + return true; + +fail_fatal: + mesa_db_zap(db); +fail: + mesa_db_unlock(db); + + return false; +} + #endif /* DETECT_OS_WINDOWS */ diff --git a/src/util/mesa_cache_db.h b/src/util/mesa_cache_db.h index 1be102f7ceb..16b77426842 100644 --- a/src/util/mesa_cache_db.h +++ b/src/util/mesa_cache_db.h @@ -62,6 +62,10 @@ bool mesa_cache_db_entry_write(struct mesa_cache_db *db, const uint8_t *cache_key_160bit, const void *blob, size_t blob_size); + +bool +mesa_cache_db_entry_remove(struct mesa_cache_db *db, + const uint8_t *cache_key_160bit); #else static inline bool mesa_cache_db_open(struct mesa_cache_db *db, const char *cache_path) @@ -101,6 +105,13 @@ mesa_cache_db_entry_write(struct mesa_cache_db *db, { return false; } + +bool +mesa_cache_db_entry_remove(struct mesa_cache_db *db, + const uint8_t *cache_key_160bit) +{ + return false; +} #endif /* DETECT_OS_WINDOWS */ #ifdef __cplusplus