Remove expired dns cache entries before removing oldest

A suggestion how to make a smarter delete function when the cache
is full. First look through the entire cache and remove all entries
which have expired. If none use the old solution and just remove
the last entry in the MRU list.

Change-Id: I5f997ab35290a55dc6e1ddf37d725759edf83d36
This commit is contained in:
Anders Fredlund 2011-05-20 08:12:37 +02:00 committed by Johan Redestig
parent a7a9dddb5d
commit dd16182b4b

View File

@ -1396,6 +1396,27 @@ _cache_remove_oldest( Cache* cache )
_cache_remove_p(cache, lookup);
}
/* Remove all expired entries from the hash table.
*/
static void _cache_remove_expired(Cache* cache) {
Entry* e;
time_t now = _time_now();
for (e = cache->mru_list.mru_next; e != &cache->mru_list;) {
// Entry is old, remove
if (now >= e->expires) {
Entry** lookup = _cache_lookup_p(cache, e);
if (*lookup == NULL) { /* should not happen */
XLOG("%s: ENTRY NOT IN HTABLE ?", __FUNCTION__);
return;
}
e = e->mru_next;
_cache_remove_p(cache, lookup);
} else {
e = e->mru_next;
}
}
}
ResolvCacheStatus
_resolv_cache_lookup( struct resolv_cache* cache,
@ -1509,7 +1530,10 @@ _resolv_cache_add( struct resolv_cache* cache,
}
if (cache->num_entries >= cache->max_entries) {
_cache_remove_oldest(cache);
_cache_remove_expired(cache);
if (cache->num_entries >= cache->max_entries) {
_cache_remove_oldest(cache);
}
/* need to lookup again */
lookup = _cache_lookup_p(cache, key);
e = *lookup;