From e588234b3aa4c7c20d9a7e4d67817c7abb47acf8 Mon Sep 17 00:00:00 2001 From: Jan Kolarik <jkolarik@redhat.com> Date: Tue, 17 Oct 2023 13:48:13 +0000 Subject: [PATCH 1/4] repo: Load filelists based on the configuration Prepare libdnf to not load the filelists metadata by default in the future. They will be loaded only when requested through the `optional_metadata_types` configuration option. --- libdnf/repo/Repo.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp index 28bcf0b30..73a3d7b42 100644 --- a/libdnf/repo/Repo.cpp +++ b/libdnf/repo/Repo.cpp @@ -432,12 +432,18 @@ std::string Repo::getMetadataContent(const std::string &metadataType) std::unique_ptr<LrHandle> Repo::Impl::lrHandleInitBase() { std::unique_ptr<LrHandle> h(lr_handle_init()); - std::vector<const char *> dlist = {MD_TYPE_PRIMARY, MD_TYPE_FILELISTS, MD_TYPE_PRESTODELTA, - MD_TYPE_GROUP_GZ, MD_TYPE_UPDATEINFO}; + std::vector<const char *> dlist = {MD_TYPE_PRIMARY, MD_TYPE_PRESTODELTA, MD_TYPE_GROUP_GZ, MD_TYPE_UPDATEINFO}; + + auto & optionalMetadataTypes = conf->getMainConfig().optional_metadata_types().getValue(); + auto loadFilelists = std::find(optionalMetadataTypes.begin(), optionalMetadataTypes.end(), "filelists") != + optionalMetadataTypes.end(); #ifdef MODULEMD dlist.push_back(MD_TYPE_MODULES); #endif + if (loadFilelists) { + dlist.push_back(MD_TYPE_FILELISTS); + } if (loadMetadataOther) { dlist.push_back(MD_TYPE_OTHER); } From 3cfe9d7bbdbe6d9d3206f598ea3bb65ee3eb5e77 Mon Sep 17 00:00:00 2001 From: Jan Kolarik <jkolarik@redhat.com> Date: Fri, 20 Oct 2023 07:09:28 +0000 Subject: [PATCH 2/4] config: Add optional_metadata_types option A new optional_metadata_types option was created to be used for configuring if filelists metadata should be downloaded by default. --- libdnf/conf/ConfigMain.cpp | 4 ++++ libdnf/conf/ConfigMain.hpp | 1 + 2 files changed, 5 insertions(+) diff --git a/libdnf/conf/ConfigMain.cpp b/libdnf/conf/ConfigMain.cpp index 40ae7b8fc..620711ee4 100644 --- a/libdnf/conf/ConfigMain.cpp +++ b/libdnf/conf/ConfigMain.cpp @@ -191,6 +191,8 @@ class ConfigMain::Impl { OptionBool debug_solver{false}; OptionStringList installonlypkgs{INSTALLONLYPKGS}; OptionStringList group_package_types{GROUP_PACKAGE_TYPES}; + // TODO(jkolarik): Change to empty list when dropping the filelists for Fedora 40 + OptionStringList optional_metadata_types{std::vector<std::string>{"filelists"}}; OptionNumber<std::uint32_t> installonly_limit{3, 0, [](const std::string & value)->std::uint32_t{ @@ -399,6 +401,7 @@ ConfigMain::Impl::Impl(Config & owner) ); owner.optBinds().add("group_package_types", group_package_types); + owner.optBinds().add("optional_metadata_types", optional_metadata_types); owner.optBinds().add("installonly_limit", installonly_limit); owner.optBinds().add("tsflags", tsflags, @@ -564,6 +567,7 @@ OptionStringList & ConfigMain::reposdir() { return pImpl->reposdir; } OptionBool & ConfigMain::debug_solver() { return pImpl->debug_solver; } OptionStringList & ConfigMain::installonlypkgs() { return pImpl->installonlypkgs; } OptionStringList & ConfigMain::group_package_types() { return pImpl->group_package_types; } +OptionStringList & ConfigMain::optional_metadata_types() { return pImpl->optional_metadata_types; } OptionNumber<std::uint32_t> & ConfigMain::installonly_limit() { return pImpl->installonly_limit; } OptionStringList & ConfigMain::tsflags() { return pImpl->tsflags; } OptionBool & ConfigMain::assumeyes() { return pImpl->assumeyes; } diff --git a/libdnf/conf/ConfigMain.hpp b/libdnf/conf/ConfigMain.hpp index 59f65c489..c63c9a827 100644 --- a/libdnf/conf/ConfigMain.hpp +++ b/libdnf/conf/ConfigMain.hpp @@ -72,6 +72,7 @@ class ConfigMain : public Config { OptionBool & debug_solver(); OptionStringList & installonlypkgs(); OptionStringList & group_package_types(); + OptionStringList & optional_metadata_types(); /* NOTE: If you set this to 2, then because it keeps the current kernel it means if you ever install an "old" kernel it'll get rid From edc343c20b0a9b6eaa777c3a62e1efb3bd29e16d Mon Sep 17 00:00:00 2001 From: Jan Kolarik <jkolarik@redhat.com> Date: Mon, 30 Oct 2023 16:57:12 +0100 Subject: [PATCH 3/4] dnf-context: Load default filelists value from config Use the default value for enabling filelists metadata from main configuration. Override the value when explicitly using the setter. --- libdnf/dnf-context.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp index e775f51f9..1ec782d00 100644 --- a/libdnf/dnf-context.cpp +++ b/libdnf/dnf-context.cpp @@ -162,7 +162,7 @@ typedef struct gboolean check_disk_space; gboolean check_transaction; gboolean only_trusted; - gboolean enable_filelists; + gboolean *enable_filelists; gboolean enrollment_valid; gboolean write_history; DnfLock *lock; @@ -252,6 +252,7 @@ dnf_context_finalize(GObject *object) g_free(priv->http_proxy); g_free(priv->user_agent); g_free(priv->arch); + g_free(priv->enable_filelists); g_strfreev(priv->native_arches); g_object_unref(priv->lock); g_object_unref(priv->state); @@ -364,7 +365,6 @@ dnf_context_init(DnfContext *context) priv->install_root = g_strdup("/"); priv->check_disk_space = TRUE; priv->check_transaction = TRUE; - priv->enable_filelists = TRUE; priv->write_history = TRUE; priv->state = dnf_state_new(); priv->lock = dnf_lock_new(); @@ -1086,7 +1086,15 @@ gboolean dnf_context_get_enable_filelists (DnfContext *context) { DnfContextPrivate *priv = GET_PRIVATE(context); - return priv->enable_filelists; + if (priv->enable_filelists == NULL) { + priv->enable_filelists = g_new(gboolean, 1); + + auto & optional_metadata_types = libdnf::getGlobalMainConfig(false).optional_metadata_types().getValue(); + *priv->enable_filelists = std::find(optional_metadata_types.begin(), + optional_metadata_types.end(), + "filelists") != optional_metadata_types.end(); + } + return *priv->enable_filelists; } /** @@ -1567,7 +1575,10 @@ dnf_context_set_enable_filelists (DnfContext *context, gboolean enable_filelists) { DnfContextPrivate *priv = GET_PRIVATE(context); - priv->enable_filelists = enable_filelists; + if (priv->enable_filelists == NULL) { + priv->enable_filelists = g_new(gboolean, 1); + } + *priv->enable_filelists = enable_filelists; } /** @@ -1824,7 +1835,7 @@ dnf_context_setup_sack_with_flags(DnfContext *context, DnfSackAddFlags add_flags = DNF_SACK_ADD_FLAG_NONE; if ((flags & DNF_CONTEXT_SETUP_SACK_FLAG_LOAD_UPDATEINFO) > 0) add_flags = static_cast<DnfSackAddFlags>(add_flags | DNF_SACK_ADD_FLAG_UPDATEINFO); - if (priv->enable_filelists && !((flags & DNF_CONTEXT_SETUP_SACK_FLAG_SKIP_FILELISTS) > 0)) + if (dnf_context_get_enable_filelists(context) && !((flags & DNF_CONTEXT_SETUP_SACK_FLAG_SKIP_FILELISTS) > 0)) add_flags = static_cast<DnfSackAddFlags>(add_flags | DNF_SACK_ADD_FLAG_FILELISTS); /* add remote */ From 2986bdbe5b21321d52fb9d167039d7121a80faf9 Mon Sep 17 00:00:00 2001 From: Jan Kolarik <jkolarik@redhat.com> Date: Mon, 22 Jan 2024 09:25:34 +0100 Subject: [PATCH 4/4] Version bump due to new optional_metadata_types option --- VERSION.cmake | 2 +- libdnf.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION.cmake b/VERSION.cmake index f049e5f66..f0b6a83a2 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -1,5 +1,5 @@ set (DEFAULT_LIBDNF_MAJOR_VERSION 0) -set (DEFAULT_LIBDNF_MINOR_VERSION 72) +set (DEFAULT_LIBDNF_MINOR_VERSION 73) set (DEFAULT_LIBDNF_MICRO_VERSION 0) if(DEFINED LIBDNF_MAJOR_VERSION) diff --git a/libdnf.spec b/libdnf.spec index 38163767d..f411db0a7 100644 --- a/libdnf.spec +++ b/libdnf.spec @@ -4,7 +4,7 @@ %global dnf_conflict 4.11.0 %global swig_version 3.0.12 %global libdnf_major_version 0 -%global libdnf_minor_version 72 +%global libdnf_minor_version 73 %global libdnf_micro_version 0 %define __cmake_in_source_build 1