From: Remi Gacogne Date: Tue, 25 Oct 2022 08:47:10 +0000 (+0200) Subject: dnsdist: Better handling of lazy backoff overflow X-Git-Tag: dnsdist-1.8.0-rc1~239^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84f5dec52b305d853ecbeb0283d2ff040d78a418;p=thirdparty%2Fpdns.git dnsdist: Better handling of lazy backoff overflow --- 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; + } } }