From e579d8f2977f17efcf5f7f158500a9df53c2370d Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 24 Jul 2025 16:02:39 +0200 Subject: [PATCH] dnsdist: Update a cache's atomic counter without holding the lock Signed-off-by: Remi Gacogne --- pdns/dnsdistdist/dnsdist-cache.cc | 20 ++++++++++++-------- pdns/dnsdistdist/dnsdist-cache.hh | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pdns/dnsdistdist/dnsdist-cache.cc b/pdns/dnsdistdist/dnsdist-cache.cc index 0a861165c6..afc1575bac 100644 --- a/pdns/dnsdistdist/dnsdist-cache.cc +++ b/pdns/dnsdistdist/dnsdist-cache.cc @@ -92,11 +92,11 @@ bool DNSDistPacketCache::cachedValueMatches(const CacheValue& cachedValue, uint1 return true; } -void DNSDistPacketCache::insertLocked(CacheShard& shard, std::unordered_map& map, uint32_t key, CacheValue& newValue) +bool DNSDistPacketCache::insertLocked(std::unordered_map& map, uint32_t key, CacheValue& newValue) { /* check again now that we hold the lock to prevent a race */ if (map.size() >= (d_settings.d_maxEntries / d_settings.d_shardCount)) { - return; + return false; } std::unordered_map::iterator mapIt; @@ -104,8 +104,7 @@ void DNSDistPacketCache::insertLocked(CacheShard& shard, std::unordered_map& subnet, uint16_t queryFlags, bool dnssecOK, const DNSName& qname, uint16_t qtype, uint16_t qclass, const PacketBuffer& response, bool receivedOverUDP, uint8_t rcode, boost::optional tempFailureTTL) @@ -199,6 +199,7 @@ void DNSDistPacketCache::insert(uint32_t key, const boost::optional& su auto& shard = d_shards.at(shardIndex); + bool inserted = false; if (d_settings.d_deferrableInsertLock) { auto lock = shard.d_map.try_write_lock(); @@ -206,12 +207,15 @@ void DNSDistPacketCache::insert(uint32_t key, const boost::optional& su ++d_deferredInserts; return; } - insertLocked(shard, *lock, key, newValue); + inserted = insertLocked(*lock, key, newValue); } else { auto lock = shard.d_map.write_lock(); - insertLocked(shard, *lock, key, newValue); + inserted = insertLocked(*lock, key, newValue); + } + if (inserted) { + ++shard.d_entriesCount; } } diff --git a/pdns/dnsdistdist/dnsdist-cache.hh b/pdns/dnsdistdist/dnsdist-cache.hh index d48397e8f9..64e19883c3 100644 --- a/pdns/dnsdistdist/dnsdist-cache.hh +++ b/pdns/dnsdistdist/dnsdist-cache.hh @@ -133,7 +133,7 @@ private: bool cachedValueMatches(const CacheValue& cachedValue, uint16_t queryFlags, const DNSName& qname, uint16_t qtype, uint16_t qclass, bool receivedOverUDP, bool dnssecOK, const boost::optional& subnet) const; uint32_t getShardIndex(uint32_t key) const; - void insertLocked(CacheShard& shard, std::unordered_map& map, uint32_t key, CacheValue& newValue); + bool insertLocked(std::unordered_map& map, uint32_t key, CacheValue& newValue); std::vector d_shards; -- 2.47.2