From: Miod Vallat Date: Thu, 17 Jul 2025 08:16:55 +0000 (+0200) Subject: Rework updateEmptyNonTerminal remove-all logic to not use too much memory. X-Git-Tag: rec-5.4.0-alpha1~365^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68f217dff808adf39754d32c2f209de50a4a4e54;p=thirdparty%2Fpdns.git Rework updateEmptyNonTerminal remove-all logic to not use too much memory. Signed-off-by: Miod Vallat --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index bc7ba9da26..7a717b0ff5 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -2883,7 +2883,7 @@ bool LMDBBackend::updateEmptyNonTerminals(domainid_t domain_id, set& in MDBOutVal val{}; std::vector names; - if (cursor.prefix(match, key, val) == 0) { + while (cursor.prefix(match, key, val) == 0) { do { if (compoundOrdername::getQType(key.getNoStripHeader()) == 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& in DNSName qname = compoundOrdername::getQName(key.getNoStripHeader()); 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(); } } }