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: auth-4.9.6~3^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30c71d3a7747758c19ac378fd55e106998100be5;p=thirdparty%2Fpdns.git Force callers of getMDBEnv() to always specify the maximum map size. Fixes: #12901 Signed-off-by: Miod Vallat (cherry picked from commit 862702653299ba91580acdf2bfa8ab09c29362b5) --- diff --git a/ext/lmdb-safe/lmdb-safe.hh b/ext/lmdb-safe/lmdb-safe.hh index 4370fb31b7..25498ff5ea 100644 --- a/ext/lmdb-safe/lmdb-safe.hh +++ b/ext/lmdb-safe/lmdb-safe.hh @@ -107,7 +107,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 6fe78abe4a..82f4d60339 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -665,9 +665,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()); @@ -723,7 +723,7 @@ LMDBBackend::LMDBBackend(const std::string& suffix) throw std::runtime_error("Somehow, we are not at schema version 5. Giving up"); } - d_tdomains = std::make_shared(getMDBEnv(getArg("filename").c_str(), MDB_NOSUBDIR | d_asyncFlag, 0600, mapSize), "domains_v5"); + d_tdomains = std::make_shared(getMDBEnv(getArg("filename").c_str(), MDB_NOSUBDIR | 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"); @@ -770,7 +770,7 @@ LMDBBackend::LMDBBackend(const std::string& suffix) } if (!opened) { - d_tdomains = std::make_shared(getMDBEnv(getArg("filename").c_str(), MDB_NOSUBDIR | d_asyncFlag, 0600, mapSize), "domains_v5"); + d_tdomains = std::make_shared(getMDBEnv(getArg("filename").c_str(), MDB_NOSUBDIR | 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"); @@ -1211,7 +1211,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 | d_asyncFlag, 0600); + MDB_NOSUBDIR | d_asyncFlag, 0600, d_mapsize); shard.dbi = shard.env->openDB("records_v5", MDB_CREATE); } auto ret = std::make_shared(shard.env->getRWTransaction()); @@ -1228,7 +1228,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 | d_asyncFlag, 0600); + MDB_NOSUBDIR | 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 40f18f8fb3..4df9c34cbe 100644 --- a/modules/lmdbbackend/lmdbbackend.hh +++ b/modules/lmdbbackend/lmdbbackend.hh @@ -333,4 +333,5 @@ private: bool d_random_ids; bool d_handle_dups; DTime d_dtime; // used only for logging + uint64_t d_mapsize; };