Commit c4e91d45 by Vicent Marti

Random eviction

parent 6b90e244
......@@ -32,7 +32,6 @@ size_t git_cache__max_object_size = 4096;
int git_cache_init(git_cache *cache)
{
cache->lru_count = 0;
cache->map = git_oidmap_alloc();
git_mutex_init(&cache->lock);
return 0;
......@@ -44,6 +43,24 @@ void git_cache_free(git_cache *cache)
git_mutex_free(&cache->lock);
}
static void cache_evict_entries(git_cache *cache, size_t evict)
{
uint32_t seed = rand();
/* do not infinite loop if there's not enough entries to evict */
if (evict > kh_size(cache->map))
return;
while (evict > 0) {
khiter_t pos = seed++ % kh_end(cache->map);
if (kh_exist(cache->map, pos)) {
kh_del(oid, cache->map, pos);
evict--;
}
}
}
static bool cache_should_store(git_otype object_type, size_t object_size)
{
if (!git_cache__store_types[object_type])
......
......@@ -23,14 +23,13 @@ enum {
typedef struct {
git_oid oid;
git_atomic refcount;
uint16_t flags;
uint16_t lru;
uint32_t cache_size;
uint32_t flags;
} git_cached_obj;
typedef struct {
git_oidmap *map;
git_mutex lock;
unsigned int lru_count;
} git_cache;
int git_cache_init(git_cache *cache);
......
......@@ -98,6 +98,7 @@ int git_object__from_odb_object(
/* Initialize parent object */
git_oid_cpy(&object->cached.oid, &odb_obj->cached.oid);
object->cached.cache_size = (uint32_t)odb_obj->raw.len;
object->repo = repo;
switch (type) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment