tie(it, result) = map.insert({key, newValue});
if (result) {
+ ++shard.d_entriesCount;
return;
}
uint32_t shardIndex = getShardIndex(key);
- if (d_shards.at(shardIndex).d_map.size() >= (d_maxEntries / d_shardCount)) {
+ if (d_shards.at(shardIndex).d_entriesCount >= (d_maxEntries / d_shardCount)) {
return;
}
if (value.validity <= now) {
it = map.erase(it);
--toRemove;
+ --d_shards[shardIndex].d_entriesCount;
++removed;
} else {
++it;
if (map.size() >= toRemove) {
std::advance(endIt, toRemove);
map.erase(beginIt, endIt);
+ shard.d_entriesCount -= toRemove;
removed += toRemove;
}
else {
removed += map.size();
map.clear();
+ shard.d_entriesCount = 0;
}
}
if ((value.qname == name || (suffixMatch && value.qname.isPartOf(name))) && (qtype == QType::ANY || qtype == value.qtype)) {
it = map.erase(it);
+ --d_shards[shardIndex].d_entriesCount;
++removed;
} else {
++it;
uint64_t count = 0;
for (auto& shard : d_shards) {
- ReadLock w(&shard.d_lock);
- count += shard.d_map.size();
+ count += shard.d_entriesCount;
}
return count;
std::unordered_map<uint32_t,CacheValue> d_map;
ReadWriteLock d_lock;
+ std::atomic<uint64_t> d_entriesCount{0};
};
bool cachedValueMatches(const CacheValue& cachedValue, uint16_t queryFlags, const DNSName& qname, uint16_t qtype, uint16_t qclass, bool tcp, bool dnssecOK, const boost::optional<Netmask>& subnet) const;