From 5b48dd1425dabbba7ab6758fe3ccf2b1410faef7 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 11 May 2023 15:07:01 +0200 Subject: [PATCH] dnsdist: Account for the health-check run time between two runs We used to wait one full second between every run, which only makes sense if the runs are not taking a long time. But as soon as we have at least one check timing out, the run is taking roughly the time of the longest timeout configured, so after this commit we: - do not wait at all if the last run took more than a full second - wait one second minus the elapsed time of the last run otherwise --- pdns/dnsdist.cc | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index 06aa910ab6..e786041e68 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -2027,11 +2027,24 @@ static void healthChecksThread() { setThreadName("dnsdist/healthC"); - constexpr int interval = 1; + constexpr int intervalUsec = 1000 * 1000; + struct timeval lastRound{ + .tv_sec = 0, + .tv_usec = 0 + }; auto states = g_dstates.getLocal(); // this points to the actual shared_ptrs! for (;;) { - sleep(interval); + struct timeval now; + gettimeofday(&now, nullptr); + auto elapsedTimeUsec = uSec(now - lastRound); + if (elapsedTimeUsec < intervalUsec) { + usleep(intervalUsec - elapsedTimeUsec); + gettimeofday(&lastRound, nullptr); + } + else { + lastRound = now; + } std::unique_ptr mplexer{nullptr}; for (auto& dss : *states) { -- 2.47.2