continue;
}
+ moveCacheItemToBack<SequencedTag>(mc.d_map, iter);
iter->value = entry.value;
iter->ttd = now + ourttl;
iter->created = now;
/* no existing entry found to refresh */
mc.d_map.insert(entry);
- (*d_statnumentries)++;
+
+ if (*d_statnumentries >= d_maxEntries) {
+ /* remove the least recently inserted or replaced entry */
+ auto& sidx = mc.d_map.get<SequencedTag>();
+ sidx.pop_front();
+ }
+ else {
+ (*d_statnumentries)++;
+ }
}
}
indexed_by <
hashed_non_unique<tag<HashTag>, member<CacheEntry,uint32_t,&CacheEntry::hash> >,
ordered_non_unique<tag<NameTag>, member<CacheEntry,DNSName,&CacheEntry::qname>, CanonDNSNameCompare >,
+ /* Note that this sequence holds 'least recently inserted or replaced', not least recently used.
+ Making it a LRU would require taking a write-lock when fetching from the cache, making the RW-lock inefficient compared to a mutex */
sequenced<tag<SequencedTag>>
>
> cmap_t;
if (!inserted) {
mc.d_map.replace(place, val);
+ moveCacheItemToBack<SequencedTag>(mc.d_map, place);
}
else {
- (*d_statnumentries)++;
+ if (*d_statnumentries >= d_maxEntries) {
+ /* remove the least recently inserted or replaced entry */
+ auto& sidx = mc.d_map.get<SequencedTag>();
+ sidx.pop_front();
+ }
+ else {
+ (*d_statnumentries)++;
+ }
}
}
}
member<CacheEntry,uint16_t,&CacheEntry::qtype>,
member<CacheEntry,int, &CacheEntry::zoneID> > > ,
ordered_non_unique<tag<NameTag>, member<CacheEntry,DNSName,&CacheEntry::qname>, CanonDNSNameCompare >,
+ /* Note that this sequence holds 'least recently inserted or replaced', not least recently used.
+ Making it a LRU would require taking a write-lock when fetching from the cache, making the RW-lock inefficient compared to a mutex */
sequenced<tag<SequencedTag>>
>
> cmap_t;