From: Miod Vallat Date: Thu, 19 Jun 2025 13:14:32 +0000 (+0200) Subject: Try and speedup deletion if flag-deleted by not doing get requests. X-Git-Tag: rec-5.3.0-alpha1~3^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=225bcfb902e65df1c2cd78b3fd2e63eda08a9d8a;p=thirdparty%2Fpdns.git Try and speedup deletion if flag-deleted by not doing get requests. Signed-off-by: Miod Vallat --- diff --git a/ext/lmdb-safe/lmdb-safe.hh b/ext/lmdb-safe/lmdb-safe.hh index dd0aa6d950..7621bf1271 100644 --- a/ext/lmdb-safe/lmdb-safe.hh +++ b/ext/lmdb-safe/lmdb-safe.hh @@ -826,35 +826,34 @@ public: void del(MDBDbi& dbi, const MDBInVal& key) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-cstyle-cast) - int mdbDelRc = mdb_del(d_txn, dbi, (MDB_val*)&key.d_mdbval, nullptr); - if ((mdbDelRc != 0) && mdbDelRc != MDB_NOTFOUND) { - throw std::runtime_error("deleting data: " + std::string(mdb_strerror(mdbDelRc))); - } #ifndef DNSDIST - if (mdbDelRc != MDB_NOTFOUND && LMDBLS::s_flag_deleted) { - // if it did exist, we need to mark it as deleted now - + if (LMDBLS::s_flag_deleted) { + // Regardless of whether or not it did exist, we need to mark it + // as deleted now. size_t txid = mdb_txn_id(d_txn); if (d_txtime == 0) { throw std::runtime_error("got zero txtime"); } std::string ins = - // std::string((const char*)&txid, sizeof(txid)) + LMDBLS::LSheader(d_txtime, txid, LMDBLS::LS_FLAG_DELETED).toString(); - MDBInVal pval = ins; - mdbDelRc = mdb_put(d_txn, dbi, - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) - const_cast(&key.d_mdbval), - const_cast(&pval.d_mdbval), 0); - if (mdbDelRc != 0) { - throw std::runtime_error("marking data deleted: " + std::string(mdb_strerror(mdbDelRc))); + int mdbPutRc = mdb_put(d_txn, dbi, + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) + const_cast(&key.d_mdbval), + const_cast(&pval.d_mdbval), 0); + if (mdbPutRc != 0) { + throw std::runtime_error("marking data deleted: " + std::string(mdb_strerror(mdbPutRc))); } + return; } #endif + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-cstyle-cast) + int mdbDelRc = mdb_del(d_txn, dbi, (MDB_val*)&key.d_mdbval, nullptr); + if (mdbDelRc != 0 && mdbDelRc != MDB_NOTFOUND) { + throw std::runtime_error("deleting data: " + std::string(mdb_strerror(mdbDelRc))); + } } int get(MDBDbi& dbi, const MDBInVal& key, MDBOutVal& val) @@ -941,17 +940,9 @@ public: #endif #ifndef DNSDIST - void del() + void del(const MDBInVal& key) { - MDBOutVal key, val; - if (LMDBLS::s_flag_deleted) { - int rc_get = mdb_cursor_get (*this, &key.d_mdbval, &val.d_mdbval, MDB_GET_CURRENT); - - if(rc_get) { - throw std::runtime_error("getting key to mark data as deleted: " + std::string(mdb_strerror(rc_get))); - } - size_t txid = mdb_txn_id(d_txn); if (d_txtime == 0) { throw std::runtime_error("got zero txtime"); } diff --git a/ext/lmdb-safe/lmdb-typed.hh b/ext/lmdb-safe/lmdb-typed.hh index bf78f8253c..f3421e1733 100644 --- a/ext/lmdb-safe/lmdb-typed.hh +++ b/ext/lmdb-safe/lmdb-typed.hh @@ -822,7 +822,7 @@ public: T value; deserializeFromBuffer(data.get(), value); clearIndex(key.get(), value); - cursor.del(); + cursor.del(key); } } diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 77e498dfff..a28eac0045 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1120,7 +1120,7 @@ void LMDBBackend::deleteDomainRecords(RecordsRWTransaction& txn, uint16_t qtype, if (cursor.prefix(match, key, val) == 0) { do { if (qtype == QType::ANY || compoundOrdername::getQType(key.getNoStripHeader()) == qtype) { - cursor.del(); + cursor.del(key); } } while (cursor.next(key, val) == 0); } @@ -1318,7 +1318,7 @@ bool LMDBBackend::replaceRRSet(domainid_t domain_id, const DNSName& qname, const match = co(domain_id, relative, qt.getCode()); // There should be at most one exact match here. if (cursor.find(match, key, val) == 0) { - cursor.del(); + cursor.del(key); } }