]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Better handling of lazy backoff overflow
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 25 Oct 2022 08:47:10 +0000 (10:47 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 25 Oct 2022 08:47:10 +0000 (10:47 +0200)
pdns/dnsdistdist/dnsdist-backend.cc

index a8a065fc15ed117c65f0f9db089f62aaafb70cf0..916df4d03e80e93a537b96e91b8b684a9c6bf9ba 100644 (file)
@@ -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<size_t>(std::numeric_limits<time_t>::max()) / d_config.d_lazyHealthCheckFailedInterval) >= backOffCoeff) {
-        backOff = d_config.d_lazyHealthCheckFailedInterval * backOffCoeff;
-        if (backOff > d_config.d_lazyHealthCheckMaxBackOff || (std::numeric_limits<time_t>::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<time_t>::max()) {
+        time_t backOffCoeff = static_cast<time_t>(backOffCoeffTmp);
+        if ((std::numeric_limits<time_t>::max() / d_config.d_lazyHealthCheckFailedInterval) >= backOffCoeff) {
+          backOff = d_config.d_lazyHealthCheckFailedInterval * backOffCoeff;
+          if (backOff > d_config.d_lazyHealthCheckMaxBackOff || (std::numeric_limits<time_t>::max() - now) <= backOff) {
+            backOff = d_config.d_lazyHealthCheckMaxBackOff;
+          }
         }
       }