From: Miod Vallat Date: Mon, 16 Jun 2025 06:22:24 +0000 (+0200) Subject: Force callers of getMDBEnv() to always specify the maximum map size. X-Git-Tag: dnsdist-2.1.0-alpha0~2^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F15677%2Fhead;p=thirdparty%2Fpdns.git Force callers of getMDBEnv() to always specify the maximum map size. Fixes: #12901 Signed-off-by: Miod Vallat --- diff --git a/ext/lmdb-safe/lmdb-safe.hh b/ext/lmdb-safe/lmdb-safe.hh index 07148ecb0d..eb26618900 100644 --- a/ext/lmdb-safe/lmdb-safe.hh +++ b/ext/lmdb-safe/lmdb-safe.hh @@ -114,7 +114,7 @@ private: std::map d_ROtransactionsOut; }; -std::shared_ptr getMDBEnv(const char* fname, int flags, int mode, uint64_t mapsizeMB=(sizeof(void *)==4) ? 100 : 16000); +std::shared_ptr getMDBEnv(const char* fname, int flags, int mode, uint64_t mapsizeMB); #ifndef DNSDIST diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index acfac59dcf..e3aae2f25e 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -696,9 +696,9 @@ LMDBBackend::LMDBBackend(const std::string& suffix) else throw std::runtime_error("Unknown sync mode " + syncMode + " requested for LMDB backend"); - uint64_t mapSize = 0; + d_mapsize = 0; try { - mapSize = std::stoll(getArg("map-size")); + d_mapsize = std::stoll(getArg("map-size")); } catch (const std::exception& e) { throw std::runtime_error(std::string("Unable to parse the 'map-size' LMDB value: ") + e.what()); @@ -759,7 +759,7 @@ LMDBBackend::LMDBBackend(const std::string& suffix) throw std::runtime_error("Somehow, we are not at schema version 6. Giving up"); } - openAllTheDatabases(mapSize); + openAllTheDatabases(); opened = true; auto pdnsdbi = d_tdomains->getEnv()->openDB("pdns", MDB_CREATE); @@ -815,7 +815,7 @@ LMDBBackend::LMDBBackend(const std::string& suffix) } if (!opened) { - openAllTheDatabases(mapSize); + openAllTheDatabases(); } d_trecords.resize(s_shards); d_dolog = ::arg().mustDo("query-logging"); @@ -838,9 +838,9 @@ LMDBBackend::~LMDBBackend() } } -void LMDBBackend::openAllTheDatabases(uint64_t mapSize) +void LMDBBackend::openAllTheDatabases() { - d_tdomains = std::make_shared(getMDBEnv(getArg("filename").c_str(), MDB_NOSUBDIR | MDB_NORDAHEAD | d_asyncFlag, 0600, mapSize), "domains_v5"); + d_tdomains = std::make_shared(getMDBEnv(getArg("filename").c_str(), MDB_NOSUBDIR | MDB_NORDAHEAD | d_asyncFlag, 0600, d_mapsize), "domains_v5"); d_tmeta = std::make_shared(d_tdomains->getEnv(), "metadata_v5"); d_tkdb = std::make_shared(d_tdomains->getEnv(), "keydata_v5"); d_ttsig = std::make_shared(d_tdomains->getEnv(), "tsig_v5"); @@ -1518,7 +1518,7 @@ std::shared_ptr LMDBBackend::getRecordsRWTran auto& shard = d_trecords[id % s_shards]; if (!shard.env) { shard.env = getMDBEnv((getArg("filename") + "-" + std::to_string(id % s_shards)).c_str(), - MDB_NOSUBDIR | MDB_NORDAHEAD | d_asyncFlag, 0600); + MDB_NOSUBDIR | MDB_NORDAHEAD | d_asyncFlag, 0600, d_mapsize); shard.dbi = shard.env->openDB("records_v5", MDB_CREATE); } auto ret = std::make_shared(shard.env->getRWTransaction()); @@ -1536,7 +1536,7 @@ std::shared_ptr LMDBBackend::getRecordsROTran throw DBException("attempting to start nested transaction without open parent env"); } shard.env = getMDBEnv((getArg("filename") + "-" + std::to_string(id % s_shards)).c_str(), - MDB_NOSUBDIR | MDB_NORDAHEAD | d_asyncFlag, 0600); + MDB_NOSUBDIR | MDB_NORDAHEAD | d_asyncFlag, 0600, d_mapsize); shard.dbi = shard.env->openDB("records_v5", MDB_CREATE); } diff --git a/modules/lmdbbackend/lmdbbackend.hh b/modules/lmdbbackend/lmdbbackend.hh index a9aaeb02aa..cc95607817 100644 --- a/modules/lmdbbackend/lmdbbackend.hh +++ b/modules/lmdbbackend/lmdbbackend.hh @@ -326,7 +326,7 @@ private: shared_ptr d_rotxn; // for lookup and list shared_ptr d_rwtxn; // for feedrecord within begin/aborttransaction bool d_txnorder{false}; // whether d_rotxn is more recent than d_rwtxn - void openAllTheDatabases(uint64_t mapSize); + void openAllTheDatabases(); std::shared_ptr getRecordsRWTransaction(domainid_t id); std::shared_ptr getRecordsROTransaction(domainid_t id, const std::shared_ptr& rwtxn = nullptr); int genChangeDomain(const ZoneName& domain, const std::function& func); @@ -356,4 +356,5 @@ private: bool d_handle_dups; bool d_views; DTime d_dtime; // used only for logging + uint64_t d_mapsize; };