mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-24 01:58:13 +00:00
Random eviction
This commit is contained in:
parent
6b90e244de
commit
c4e91d4500
19
src/cache.c
19
src/cache.c
@ -32,7 +32,6 @@ size_t git_cache__max_object_size = 4096;
|
|||||||
|
|
||||||
int git_cache_init(git_cache *cache)
|
int git_cache_init(git_cache *cache)
|
||||||
{
|
{
|
||||||
cache->lru_count = 0;
|
|
||||||
cache->map = git_oidmap_alloc();
|
cache->map = git_oidmap_alloc();
|
||||||
git_mutex_init(&cache->lock);
|
git_mutex_init(&cache->lock);
|
||||||
return 0;
|
return 0;
|
||||||
@ -44,6 +43,24 @@ void git_cache_free(git_cache *cache)
|
|||||||
git_mutex_free(&cache->lock);
|
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)
|
static bool cache_should_store(git_otype object_type, size_t object_size)
|
||||||
{
|
{
|
||||||
if (!git_cache__store_types[object_type])
|
if (!git_cache__store_types[object_type])
|
||||||
|
@ -23,14 +23,13 @@ enum {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
git_oid oid;
|
git_oid oid;
|
||||||
git_atomic refcount;
|
git_atomic refcount;
|
||||||
uint16_t flags;
|
uint32_t cache_size;
|
||||||
uint16_t lru;
|
uint32_t flags;
|
||||||
} git_cached_obj;
|
} git_cached_obj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
git_oidmap *map;
|
git_oidmap *map;
|
||||||
git_mutex lock;
|
git_mutex lock;
|
||||||
unsigned int lru_count;
|
|
||||||
} git_cache;
|
} git_cache;
|
||||||
|
|
||||||
int git_cache_init(git_cache *cache);
|
int git_cache_init(git_cache *cache);
|
||||||
|
@ -98,6 +98,7 @@ int git_object__from_odb_object(
|
|||||||
|
|
||||||
/* Initialize parent object */
|
/* Initialize parent object */
|
||||||
git_oid_cpy(&object->cached.oid, &odb_obj->cached.oid);
|
git_oid_cpy(&object->cached.oid, &odb_obj->cached.oid);
|
||||||
|
object->cached.cache_size = (uint32_t)odb_obj->raw.len;
|
||||||
object->repo = repo;
|
object->repo = repo;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
Loading…
Reference in New Issue
Block a user