From 84f5dec52b305d853ecbeb0283d2ff040d78a418 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Tue, 25 Oct 2022 10:47:10 +0200 Subject: [PATCH] dnsdist: Better handling of lazy backoff overflow --- pdns/dnsdistdist/dnsdist-backend.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pdns/dnsdistdist/dnsdist-backend.cc b/pdns/dnsdistdist/dnsdist-backend.cc index a8a065fc15..916df4d03e 100644 --- a/pdns/dnsdistdist/dnsdist-backend.cc +++ b/pdns/dnsdistdist/dnsdist-backend.cc @@ -585,13 +585,16 @@ void DownstreamState::updateNextLazyHealthCheck(LazyHealthCheckStats& stats) stats.d_nextCheck = now + d_config.d_lazyHealthCheckFailedInterval; } else { - const uint16_t failedTests = currentCheckFailures; - size_t backOffCoeff = std::pow(2U, failedTests); time_t backOff = d_config.d_lazyHealthCheckMaxBackOff; - if ((static_cast(std::numeric_limits::max()) / d_config.d_lazyHealthCheckFailedInterval) >= backOffCoeff) { - backOff = d_config.d_lazyHealthCheckFailedInterval * backOffCoeff; - if (backOff > d_config.d_lazyHealthCheckMaxBackOff || (std::numeric_limits::max() - now) <= backOff) { - backOff = d_config.d_lazyHealthCheckMaxBackOff; + const uint16_t failedTests = currentCheckFailures; + double backOffCoeffTmp = std::pow(2U, failedTests); + if (backOffCoeffTmp != HUGE_VAL && backOffCoeffTmp <= std::numeric_limits::max()) { + time_t backOffCoeff = static_cast(backOffCoeffTmp); + if ((std::numeric_limits::max() / d_config.d_lazyHealthCheckFailedInterval) >= backOffCoeff) { + backOff = d_config.d_lazyHealthCheckFailedInterval * backOffCoeff; + if (backOff > d_config.d_lazyHealthCheckMaxBackOff || (std::numeric_limits::max() - now) <= backOff) { + backOff = d_config.d_lazyHealthCheckMaxBackOff; + } } } -- 2.47.2