]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Properly stop upgraded backends, remove them from pools
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 9 Feb 2022 09:44:35 +0000 (10:44 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 22 Feb 2022 09:00:59 +0000 (10:00 +0100)
pdns/dnsdistdist/dnsdist-backend.cc
pdns/dnsdistdist/dnsdist-discovery.cc

index a039ee6f07c7115ecfb0d5c99c1cc08092a40bbf..25dd110345f0a2384cd595e59e603f1c8a5d890b 100644 (file)
@@ -112,6 +112,9 @@ bool DownstreamState::reconnect()
 
 void DownstreamState::stop()
 {
+  if (d_stopped) {
+    return;
+  }
   d_stopped = true;
 
   {
index 8821f4ea819255da1b419d7c007dfb822bd3c9dc..038148383b9dee5861167211d5861373e98b0dc0 100644 (file)
@@ -454,7 +454,6 @@ bool ServiceDiscovery::tryToUpgradeBackend(const UpgradeableBackend& backend)
     else {
       addServerToPool(localPools, "", newServer);
     }
-    g_pools.setState(localPools);
 
     newServer->start();
 
@@ -468,12 +467,21 @@ bool ServiceDiscovery::tryToUpgradeBackend(const UpgradeableBackend& backend)
           break;
         }
       }
+
+      for (const string& poolName : backend.d_ds->d_config.pools) {
+        removeServerFromPool(localPools, poolName, backend.d_ds);
+      }
+      /* the server might also be in the default pool */
+      removeServerFromPool(localPools, "", backend.d_ds);
     }
 
     std::stable_sort(states.begin(), states.end(), [](const decltype(newServer)& a, const decltype(newServer)& b) {
       return a->d_config.order < b->d_config.order;
     });
+
+    g_pools.setState(localPools);
     g_dstates.setState(states);
+    backend.d_ds->stop();
 
     return true;
   }