]> granicus.if.org Git - pdns/commitdiff
rec: Purge nsSpeeds entries even if we get less than 2 new entries
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 2 Nov 2017 13:54:46 +0000 (14:54 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 2 Nov 2017 13:54:46 +0000 (14:54 +0100)
pdns/syncres.cc

index 504aa61cee718b2efec7803a1dafd7606315a323..5795cbf03ba4c2f31904b9e36e4db1fd4bf1e9ab 100644 (file)
@@ -685,17 +685,21 @@ vector<ComboAddress> SyncRes::getAddrs(const DNSName &qname, unsigned int depth,
   d_requireAuthData = oldRequireAuthData;
   d_DNSSECValidationRequested = oldValidationRequested;
 
-  if(ret.size() > 1) {
-    map<ComboAddress, double> speeds;
-    auto& collection = t_sstorage.nsSpeeds[qname].d_collection;
-    for(const auto& val: ret) {
-      double speed;
-      speed=collection[val].get(&d_now);
-      speeds[val]=speed;
-    }
+  /* we need to remove from the nsSpeeds collection the existing IPs
+     for this nameserver that are no longer in the set, even if there
+     is only one or none at all in the current set.
+  */
+  map<ComboAddress, double> speeds;
+  auto& collection = t_sstorage.nsSpeeds[qname].d_collection;
+  for(const auto& val: ret) {
+    double speed;
+    speed=collection[val].get(&d_now);
+    speeds[val]=speed;
+  }
 
-    t_sstorage.nsSpeeds[qname].purge(speeds);
+  t_sstorage.nsSpeeds[qname].purge(speeds);
 
+  if(ret.size() > 1) {
     random_shuffle(ret.begin(), ret.end(), dns_random);
     speedOrderCA so(speeds);
     stable_sort(ret.begin(), ret.end(), so);