From: Remi Gacogne Date: Fri, 12 Aug 2022 08:50:04 +0000 (+0200) Subject: dnsdist: Slightly reduce contention around a pool's servers X-Git-Tag: rec-4.8.0-alpha1~58^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cbc643c0e0c0e79533d840b8681cfa07d19765f2;p=thirdparty%2Fpdns.git dnsdist: Slightly reduce contention around a pool's servers We only need to take the lock to get the shared pointer, as the actual content is guaranteed not to change, so we do not need to hold the lock while we iterate over the servers list to check whether they are up, or what their current outstanding count is. --- diff --git a/pdns/dnsdistdist/dnsdist-backend.cc b/pdns/dnsdistdist/dnsdist-backend.cc index e12dd77284..95ab0c4b4b 100644 --- a/pdns/dnsdistdist/dnsdist-backend.cc +++ b/pdns/dnsdistdist/dnsdist-backend.cc @@ -475,21 +475,32 @@ IDState* DownstreamState::getIDState(unsigned int& selectedID, int64_t& generati size_t ServerPool::countServers(bool upOnly) { + std::shared_ptr servers = nullptr; + { + auto lock = d_servers.read_lock(); + servers = *lock; + } + size_t count = 0; - auto servers = d_servers.read_lock(); - for (const auto& server : **servers) { + for (const auto& server : *servers) { if (!upOnly || std::get<1>(server)->isUp() ) { count++; } } + return count; } size_t ServerPool::poolLoad() { + std::shared_ptr servers = nullptr; + { + auto lock = d_servers.read_lock(); + servers = *lock; + } + size_t load = 0; - auto servers = d_servers.read_lock(); - for (const auto& server : **servers) { + for (const auto& server : *servers) { size_t serverOutstanding = std::get<1>(server)->outstanding.load(); load += serverOutstanding; }