From 45922b47ece3f1010aa7ddc6092ac06d8fde1da4 Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 26 Jan 2022 00:41:53 +0100 Subject: [PATCH] lmdb: Allow configuring cache limit --- libpkg/data/config.cpp | 5 +++++ libpkg/data/config.h | 1 + libpkg/data/storage.cpp | 15 +++++++++++++++ libpkg/data/storageprivate.h | 8 ++++++++ librepomgr/serversetup.cpp | 4 ++++ librepomgr/serversetup.h | 1 + 6 files changed, 34 insertions(+) diff --git a/libpkg/data/config.cpp b/libpkg/data/config.cpp index f5f9def..98a928a 100644 --- a/libpkg/data/config.cpp +++ b/libpkg/data/config.cpp @@ -62,6 +62,11 @@ void Config::initStorage(const char *path, std::uint32_t maxDbs) aur.initStorage(*m_storage); } +void Config::setPackageCacheLimit(std::size_t limit) +{ + m_storage->packageCache().setLimit(limit); +} + static std::string addDatabaseDependencies( Config &config, Database &database, std::vector &result, std::unordered_map &visited, bool addSelf) { diff --git a/libpkg/data/config.h b/libpkg/data/config.h index a72755f..751ad04 100644 --- a/libpkg/data/config.h +++ b/libpkg/data/config.h @@ -115,6 +115,7 @@ struct LIBPKG_EXPORT Config : public Lockable, public ReflectiveRapidJSON::Binar // storage and caching void initStorage(const char *path = "libpkg.db", std::uint32_t maxDbs = 0); + void setPackageCacheLimit(std::size_t limit); std::unique_ptr &storage(); std::uint64_t restoreFromCache(); std::uint64_t dumpCacheFile(); diff --git a/libpkg/data/storage.cpp b/libpkg/data/storage.cpp index cc466e0..8e4d8b0 100644 --- a/libpkg/data/storage.cpp +++ b/libpkg/data/storage.cpp @@ -43,6 +43,14 @@ template std::size_t StorageCacheEntries void StorageCacheEntries::setLimit(std::size_t limit) +{ + m_limit = limit; + while (m_entries.size() > limit) { + m_entries.pop_back(); + } +} + template auto StorageCache::retrieve(Storage &storage, ROTxn *txn, StorageID storageID) -> SpecType { @@ -234,6 +242,13 @@ void StorageCache::clearCacheOnly(Sto m_entries.clear(storage); } +template +void StorageCache::setLimit(std::size_t limit) +{ + const auto lock = std::unique_lock(m_mutex); + m_entries.setLimit(limit); +} + template struct StorageCacheRef; template struct StorageCacheEntry; template class StorageCacheEntries; diff --git a/libpkg/data/storageprivate.h b/libpkg/data/storageprivate.h index 29ac416..f731c0a 100644 --- a/libpkg/data/storageprivate.h +++ b/libpkg/data/storageprivate.h @@ -104,6 +104,7 @@ public: std::size_t clear(const Storage &storage); iterator begin(); iterator end(); + void setLimit(std::size_t limit); private: EntryList m_entries; @@ -156,6 +157,7 @@ template bool invalidate(Storage &storage, const std::string &entryName); void clear(Storage &storage); void clearCacheOnly(Storage &storage); + void setLimit(std::size_t limit); private: Entries m_entries; @@ -181,6 +183,7 @@ struct StorageDistribution { explicit StorageDistribution(const char *path, std::uint32_t maxDbs); std::unique_ptr forDatabase(std::string_view uniqueDatabaseName); + PackageCache &packageCache(); private: std::shared_ptr m_env; @@ -192,6 +195,11 @@ inline std::unique_ptr StorageDistribution::forDatabase(std::st return std::make_unique(m_env, m_packageCache, uniqueDatabaseName); } +inline PackageCache &StorageDistribution::packageCache() +{ + return m_packageCache; +} + struct DatabaseStorage { explicit DatabaseStorage(const std::shared_ptr &env, PackageCache &packageCache, std::string_view uniqueDatabaseName); PackageCache &packageCache; diff --git a/librepomgr/serversetup.cpp b/librepomgr/serversetup.cpp index c6c26f3..f597523 100644 --- a/librepomgr/serversetup.cpp +++ b/librepomgr/serversetup.cpp @@ -235,6 +235,7 @@ void ServiceSetup::loadConfigFiles(bool doFirstTimeSetup) convertValue(iniEntry.second, "pacman_config_file_path", pacmanConfigFilePath); convertValue(iniEntry.second, "working_directory", workingDirectory); convertValue(iniEntry.second, "max_dbs", maxDbs); + convertValue(iniEntry.second, "package_cache_limit", packageCacheLimit); } } // apply working directory @@ -288,6 +289,8 @@ void ServiceSetup::loadConfigFiles(bool doFirstTimeSetup) // restore state/cache and discard databases if not done yet if (doFirstTimeSetup) { initStorage(); + } else { + config.setPackageCacheLimit(packageCacheLimit); } // read pacman config @@ -509,6 +512,7 @@ std::size_t ServiceSetup::restoreState() // open LMDB storage cout << Phrases::InfoMessage << "Opening LMDB file: " << dbPath << " (max DBs: " << maxDbs << ')' << Phrases::EndFlush; config.initStorage(dbPath.data(), maxDbs); + config.setPackageCacheLimit(packageCacheLimit); // restore build actions from JSON file if (!hasBuildActions) { diff --git a/librepomgr/serversetup.h b/librepomgr/serversetup.h index c0fa37f..5274c61 100644 --- a/librepomgr/serversetup.h +++ b/librepomgr/serversetup.h @@ -44,6 +44,7 @@ struct LIBREPOMGR_EXPORT ServiceSetup : public LibPkg::Lockable { std::string workingDirectory = "workingdir"; std::string dbPath = "libpkg.db"; std::uint32_t maxDbs = 512; + std::size_t packageCacheLimit = 1000; // variables relevant for the web server; only changed when (re)loading config struct LIBREPOMGR_EXPORT WebServerSetup {