From: Miod Vallat Date: Thu, 19 Jun 2025 10:29:47 +0000 (+0200) Subject: Make lmdb del() operations throw upon error. X-Git-Tag: rec-5.3.0-alpha1~3^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=436f4284b6b4cdf305bf04ae792f27bf4d1aca99;p=thirdparty%2Fpdns.git Make lmdb del() operations throw upon error. In the current state of the code, in flag-deleted mode, failures always throw; but in regular mode, in the unlikely event of an error during deletion from cursor, the returned value would be either ignored or... used to throw an exception. Signed-off-by: Miod Vallat --- diff --git a/ext/lmdb-safe/lmdb-safe.hh b/ext/lmdb-safe/lmdb-safe.hh index 07148ecb0d..d8b84f7900 100644 --- a/ext/lmdb-safe/lmdb-safe.hh +++ b/ext/lmdb-safe/lmdb-safe.hh @@ -824,7 +824,7 @@ public: } #endif - int del(MDBDbi& dbi, const MDBInVal& key) + 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); @@ -855,7 +855,6 @@ public: } } #endif - return mdbDelRc; } int get(MDBDbi& dbi, const MDBInVal& key, MDBOutVal& val) @@ -942,7 +941,7 @@ public: #endif #ifndef DNSDIST - int del(int flags=0) + void del(int flags=0) { MDBOutVal key, val; @@ -950,7 +949,7 @@ public: 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))); + 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); @@ -966,15 +965,16 @@ public: int rc_put = mdb_cursor_put(*this, const_cast(&pkey.d_mdbval), - const_cast(&pval.d_mdbval), 0 /* MDB_CURRENT */); + const_cast(&pval.d_mdbval), 0); if(rc_put) { - throw std::runtime_error("marking data deleted: " + std::string(mdb_strerror(rc_put))); + throw std::runtime_error("marking data deleted: " + std::string(mdb_strerror(rc_put))); } - return rc_put; } else { // do a normal delete - return mdb_cursor_del(*this, flags); + if (int rc_del = mdb_cursor_del(*this, flags); rc_del != 0) { + throw std::runtime_error("deleting data: " + std::string(mdb_strerror(rc_del))); + } } } #endif diff --git a/ext/lmdb-safe/lmdb-typed.hh b/ext/lmdb-safe/lmdb-typed.hh index 4cdcb4efaf..bf78f8253c 100644 --- a/ext/lmdb-safe/lmdb-typed.hh +++ b/ext/lmdb-safe/lmdb-typed.hh @@ -158,10 +158,7 @@ struct LMDBIndexOps auto scombined = makeCombinedKey(keyConv(d_parent->getMember(type)), idVal); MDBInVal combined(scombined); - int errCode = txn->del(d_idx, combined); - if (errCode != 0) { - throw std::runtime_error("Error deleting from index: " + std::string(mdb_strerror(errCode))); - } + txn->del(d_idx, combined); } void openDB(std::shared_ptr& env, string_view str, int flags)