]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Reduce contention around the sampling counter in the rings
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 23 Jan 2026 10:07:23 +0000 (11:07 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 23 Jan 2026 14:04:01 +0000 (15:04 +0100)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsdistdist/dnsdist-rings.cc
pdns/dnsdistdist/dnsdist-rings.hh

index e1d9b607e17017dc9faee8abf29a732ad9227895..8ac89cb78633792c5af470d8c5db1c6f62733eba 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "dnsdist-rings.hh"
 
+thread_local size_t Rings::t_samplingCounter{0};
+
 void Rings::init(const RingsConfiguration& config)
 {
   if (d_initialized.exchange(true)) {
@@ -207,8 +209,8 @@ bool Rings::shouldSkipDueToSampling()
   if (d_samplingRate == 0) {
     return false;
   }
-  auto counter = d_samplingCounter++;
-  return (counter % d_samplingRate) == 0;
+  auto counter = t_samplingCounter++;
+  return (counter % d_samplingRate) != 0;
 }
 
 uint32_t Rings::adjustForSamplingRate(uint32_t count) const
index 03378941fdffeb28a1efb9ee3e4b64d926d225f2..ef99dd2c7da1a2bb5c0b0c0b3233ceb974b3058b 100644 (file)
@@ -290,6 +290,9 @@ private:
   bool shouldSkipDueToSampling();
 
   static constexpr bool s_keepLockingStats{false};
+  // small hack to reduce contention: this only works because we have a single Rings object in DNSdist
+  static thread_local size_t t_samplingCounter;
+
 
   std::atomic<size_t> d_nbQueryEntries{0};
   std::atomic<size_t> d_nbResponseEntries{0};
@@ -300,7 +303,6 @@ private:
   size_t d_numberOfShards{10};
   size_t d_nbLockTries{5};
   size_t d_samplingRate{0};
-  std::atomic<size_t> d_samplingCounter{0};
   bool d_recordQueries{true};
   bool d_recordResponses{true};
 };