From: Remi Gacogne Date: Fri, 18 Jul 2025 10:06:48 +0000 (+0200) Subject: dnsdist: Improve the scalability of the MAC address cache X-Git-Tag: rec-5.4.0-alpha0~12^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F15868%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Improve the scalability of the MAC address cache Signed-off-by: Remi Gacogne --- diff --git a/pdns/dnsdistdist/dnsdist-mac-address.cc b/pdns/dnsdistdist/dnsdist-mac-address.cc index 20a7245a9f..eed10b3f73 100644 --- a/pdns/dnsdistdist/dnsdist-mac-address.cc +++ b/pdns/dnsdistdist/dnsdist-mac-address.cc @@ -25,7 +25,7 @@ namespace dnsdist { -LockGuarded> MacAddressesCache::s_cache; +SharedLockGuarded> MacAddressesCache::s_cache; int MacAddressesCache::get(const ComboAddress& ca, unsigned char* dest, size_t destLen) { @@ -37,7 +37,7 @@ int MacAddressesCache::get(const ComboAddress& ca, unsigned char* dest, size_t d time_t now = time(nullptr); { - auto cache = s_cache.lock(); + auto cache = s_cache.read_lock(); for (const auto& entry : *cache) { if (entry.ttd >= now && compare(entry.ca, ca) == true) { if (!entry.found) { @@ -51,22 +51,22 @@ int MacAddressesCache::get(const ComboAddress& ca, unsigned char* dest, size_t d } auto res = getMACAddress(ca, reinterpret_cast(dest), destLen); + Entry entry; + entry.ca = ca; + if (res == 0) { + memcpy(entry.mac.data(), dest, entry.mac.size()); + entry.found = true; + } + else { + memset(entry.mac.data(), 0, entry.mac.size()); + entry.found = false; + } + entry.ttd = now + MacAddressesCache::s_cacheValiditySeconds; { - auto cache = s_cache.lock(); + auto cache = s_cache.write_lock(); if (cache->capacity() == 0) { cache->set_capacity(MacAddressesCache::s_cacheSize); } - Entry entry; - entry.ca = ca; - if (res == 0) { - memcpy(entry.mac.data(), dest, entry.mac.size()); - entry.found = true; - } - else { - memset(entry.mac.data(), 0, entry.mac.size()); - entry.found = false; - } - entry.ttd = now + MacAddressesCache::s_cacheValiditySeconds; cache->push_back(std::move(entry)); } diff --git a/pdns/dnsdistdist/dnsdist-mac-address.hh b/pdns/dnsdistdist/dnsdist-mac-address.hh index fe2f1f0fe6..4fc69156af 100644 --- a/pdns/dnsdistdist/dnsdist-mac-address.hh +++ b/pdns/dnsdistdist/dnsdist-mac-address.hh @@ -45,6 +45,6 @@ private: static constexpr size_t s_cacheSize{10}; static constexpr time_t s_cacheValiditySeconds{60}; - static LockGuarded> s_cache; + static SharedLockGuarded> s_cache; }; }