]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Rework updateEmptyNonTerminal remove-all logic to not use too much memory.
authorMiod Vallat <miod.vallat@powerdns.com>
Thu, 17 Jul 2025 08:16:55 +0000 (10:16 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Thu, 17 Jul 2025 08:16:55 +0000 (10:16 +0200)
Signed-off-by: Miod Vallat <miod.vallat@powerdns.com>
modules/lmdbbackend/lmdbbackend.cc

index bc7ba9da265d0c67f2e581c01dbea5baa22a3aca..7a717b0ff5886c714c4e63c5ea6f303090424c3b 100644 (file)
@@ -2883,7 +2883,7 @@ bool LMDBBackend::updateEmptyNonTerminals(domainid_t domain_id, set<DNSName>& in
       MDBOutVal val{};
       std::vector<DNSName> names;
 
-      if (cursor.prefix(match, key, val) == 0) {
+      while (cursor.prefix(match, key, val) == 0) {
         do {
           if (compoundOrdername::getQType(key.getNoStripHeader<StringView>()) == QType::ENT) {
             // We need to remember the name of the records we're deleting, so
@@ -2893,11 +2893,17 @@ bool LMDBBackend::updateEmptyNonTerminals(domainid_t domain_id, set<DNSName>& in
             DNSName qname = compoundOrdername::getQName(key.getNoStripHeader<StringView>());
             names.emplace_back(qname);
             cursor.del(key);
+            // Do not risk accumulating too many names. Better iterate
+            // multiple times, there won't be any ENT left eventually.
+            if (names.size() >= 100) {
+              break;
+            }
           }
         } while (cursor.next(key, val) == 0);
-      }
-      for (const auto& qname : names) {
-        deleteNSEC3RecordPair(txn, domain_id, qname);
+        for (const auto& qname : names) {
+          deleteNSEC3RecordPair(txn, domain_id, qname);
+        }
+        names.clear();
       }
     }
   }