const unsigned int AuthPacketCache::s_mincleaninterval, AuthPacketCache::s_maxcleaninterval;
-AuthPacketCache::AuthPacketCache(size_t mapsCount): d_lastclean(time(nullptr)), d_maps(mapsCount)
+AuthPacketCache::AuthPacketCache(size_t mapsCount): d_maps(mapsCount), d_lastclean(time(nullptr))
{
S.declare("packetcache-hit", "Number of hits on the packet cache");
S.declare("packetcache-miss", "Number of misses on the packet cache");
AuthPacketCache::~AuthPacketCache()
{
try {
- vector<WriteLock*> locks;
+ vector<WriteLock> locks;
for(auto& mc : d_maps) {
- locks.push_back(new WriteLock(&mc.d_mut));
- }
- for(auto wl : locks) {
- delete wl;
+ locks.push_back(WriteLock(mc.d_mut));
}
+ locks.clear();
}
catch(...) {
}
}
+void AuthPacketCache::MapCombo::reserve(size_t numberOfEntries)
+{
+#if BOOST_VERSION >= 105600
+ WriteLock wl(&d_mut);
+ d_map.get<HashTag>().reserve(numberOfEntries);
+#endif /* BOOST_VERSION >= 105600 */
+}
+
bool AuthPacketCache::get(DNSPacket& p, DNSPacket& cached)
{
if(!d_ttl) {
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)++;
+ mc.d_map.insert(std::move(entry));
+
+ 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);
+ }
}
}
void AuthPacketCache::cleanup()
{
- uint64_t maxCached = d_maxEntries;
- uint64_t cacheSize = *d_statnumentries;
- uint64_t totErased = 0;
-
- totErased = pruneLockedCollectionsVector<SequencedTag>(d_maps, maxCached, cacheSize);
+ uint64_t totErased = pruneLockedCollectionsVector<SequencedTag>(d_maps);
*d_statnumentries -= totErased;
DLOG(g_log<<"Done with cache clean, cacheSize: "<<(*d_statnumentries)<<", totErased"<<totErased<<endl);