From: Miod Vallat Date: Fri, 13 Jun 2025 06:58:36 +0000 (+0200) Subject: Use atomic types for the latency metrics. X-Git-Tag: dnsdist-2.0.0-beta1~31^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F15667%2Fhead;p=thirdparty%2Fpdns.git Use atomic types for the latency metrics. --- diff --git a/pdns/auth-main.cc b/pdns/auth-main.cc index cfe621282e..88c3071b64 100644 --- a/pdns/auth-main.cc +++ b/pdns/auth-main.cc @@ -127,7 +127,7 @@ AuthZoneCache g_zoneCache; std::unique_ptr DP{nullptr}; static std::unique_ptr s_dynListener{nullptr}; CommunicatorClass Communicator; -static double avg_latency{0.0}, receive_latency{0.0}, cache_latency{0.0}, backend_latency{0.0}, send_latency{0.0}; +static std::atomic avg_latency{0.0}, receive_latency{0.0}, cache_latency{0.0}, backend_latency{0.0}, send_latency{0.0}; static unique_ptr s_tcpNameserver{nullptr}; static vector s_distributors; static shared_ptr s_udpNameserver{nullptr}; @@ -523,6 +523,12 @@ static int isGuarded(char** argv) return !!p; } +static void update_latencies(int start, int diff) +{ + send_latency = 0.999 * send_latency + 0.001 * std::max(diff - start, 0); + avg_latency = 0.999 * avg_latency + 0.001 * std::max(diff, 0); // 'EWMA' +} + static void sendout(std::unique_ptr& a, int start) { if (!a) @@ -536,9 +542,7 @@ static void sendout(std::unique_ptr& a, int start) s_udpNameserver->send(*a); diff = a->d_dt.udiff(); - send_latency = 0.999 * send_latency + 0.001 * std::max(diff - start, 0); - - avg_latency = 0.999 * avg_latency + 0.001 * std::max(diff, 0); + update_latencies(start, diff); } catch (const std::exception& e) { g_log << Logger::Error << "Caught unhandled exception while sending a response: " << e.what() << endl; @@ -653,8 +657,7 @@ try { NS->send(cached); // answer it then inlined diff = question.d_dt.udiff(); - send_latency = 0.999 * send_latency + 0.001 * std::max(diff - start, 0); - avg_latency = 0.999 * avg_latency + 0.001 * std::max(diff, 0); // 'EWMA' + update_latencies(start, diff); continue; } diff = question.d_dt.udiffNoReset();