From 8b872adce835bcb0d94c01a5f5d715f9d491bfa5 Mon Sep 17 00:00:00 2001 From: Pavla Kratochvilova Date: Wed, 7 Aug 2019 12:40:30 +0200 Subject: [PATCH] Update to 0.35.3 --- .gitignore | 2 + ...taching-and-detaching-of-libsolvRepo.patch | 265 ------------------ libdnf.spec | 32 ++- sources | 2 +- 4 files changed, 30 insertions(+), 271 deletions(-) delete mode 100644 0003-Fix-attaching-and-detaching-of-libsolvRepo.patch diff --git a/.gitignore b/.gitignore index 34291a0..bd0fa05 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ /libdnf-0.28.1.tar.gz /libdnf-0.31.0.tar.gz /libdnf-0.35.1.tar.gz +/libdnf-0.35.2.tar.gz +/libdnf-0.35.3.tar.gz diff --git a/0003-Fix-attaching-and-detaching-of-libsolvRepo.patch b/0003-Fix-attaching-and-detaching-of-libsolvRepo.patch deleted file mode 100644 index 29e542a..0000000 --- a/0003-Fix-attaching-and-detaching-of-libsolvRepo.patch +++ /dev/null @@ -1,265 +0,0 @@ -From d267539801ce0a32392d3a86d94e6ea37b6dc2ba Mon Sep 17 00:00:00 2001 -From: Jaroslav Rohel -Date: Fri, 12 Jul 2019 06:51:25 +0200 -Subject: [PATCH 1/5] [context] Fix: Correctly detach libsolv repo - (RhBug:1727343) - -Seting repoImpl->libsolvRepo = nullptr and repoImpl->nrefs = 1 is not sufficient. -The libsolvRepo inernally points back to us. And during destroying -it destroy us too because nrefs was set to 1. -Solution is to do full detach using detachLibsolvRepo(). - -It fixes https://bugzilla.redhat.com/show_bug.cgi?id=1727343 -and probably https://bugzilla.redhat.com/show_bug.cgi?id=1727424 ---- - libdnf/dnf-repo.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libdnf/dnf-repo.cpp b/libdnf/dnf-repo.cpp -index a358356a9..45c6c7e5b 100644 ---- a/libdnf/dnf-repo.cpp -+++ b/libdnf/dnf-repo.cpp -@@ -1403,9 +1403,9 @@ dnf_repo_check_internal(DnfRepo *repo, - } - - /* init */ -- repoImpl->libsolvRepo = nullptr; -+ if (repoImpl->libsolvRepo) -+ repoImpl->detachLibsolvRepo(); - repoImpl->needs_internalizing = false; -- repoImpl->nrefs = 1; - repoImpl->state_main = _HY_NEW; - repoImpl->state_filelists = _HY_NEW; - repoImpl->state_presto = _HY_NEW; - -From f1e2e534d7d375d051c4eae51431c5bb3649f9f1 Mon Sep 17 00:00:00 2001 -From: Jaroslav Rohel -Date: Fri, 12 Jul 2019 07:59:15 +0200 -Subject: [PATCH 2/5] [Repo] Remove unused delReference - ---- - libdnf/repo/Repo.cpp | 7 ------- - libdnf/repo/Repo.hpp | 2 -- - 2 files changed, 9 deletions(-) - -diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp -index 23638839a..fd2415fa5 100644 ---- a/libdnf/repo/Repo.cpp -+++ b/libdnf/repo/Repo.cpp -@@ -1441,13 +1441,6 @@ std::vector Repo::getMirrors() const - return mirrors; - } - --void Repo::delReference() --{ -- if (--pImpl->nrefs > 0) -- return; -- delete this; --} -- - int PackageTargetCB::end(TransferStatus status, const char * msg) { return 0; } - int PackageTargetCB::progress(double totalToDownload, double downloaded) { return 0; } - int PackageTargetCB::mirrorFailure(const char *msg, const char *url) { return 0; } -diff --git a/libdnf/repo/Repo.hpp b/libdnf/repo/Repo.hpp -index cbf4ed147..785c6e9d5 100644 ---- a/libdnf/repo/Repo.hpp -+++ b/libdnf/repo/Repo.hpp -@@ -275,8 +275,6 @@ struct Repo { - - ~Repo(); - -- void delReference(); -- - class Impl; - private: - friend struct PackageTarget; - -From 4c35d135bc79939d58844e99e0d5ed924ba86fd5 Mon Sep 17 00:00:00 2001 -From: Jaroslav Rohel -Date: Fri, 12 Jul 2019 08:50:54 +0200 -Subject: [PATCH 3/5] [Repo] Add locking and asserts - -Add locking and asserts into attachLibsolvRepo(), detachLibsolvRepo() -and hy_repo_free() ---- - libdnf/dnf-repo.cpp | 3 +-- - libdnf/repo/Repo-private.hpp | 5 +++++ - libdnf/repo/Repo.cpp | 34 ++++++++++++++++++++++++++-------- - 3 files changed, 32 insertions(+), 10 deletions(-) - -diff --git a/libdnf/dnf-repo.cpp b/libdnf/dnf-repo.cpp -index 45c6c7e5b..c30d99d17 100644 ---- a/libdnf/dnf-repo.cpp -+++ b/libdnf/dnf-repo.cpp -@@ -1403,8 +1403,7 @@ dnf_repo_check_internal(DnfRepo *repo, - } - - /* init */ -- if (repoImpl->libsolvRepo) -- repoImpl->detachLibsolvRepo(); -+ repoImpl->detachLibsolvRepo(); - repoImpl->needs_internalizing = false; - repoImpl->state_main = _HY_NEW; - repoImpl->state_filelists = _HY_NEW; -diff --git a/libdnf/repo/Repo-private.hpp b/libdnf/repo/Repo-private.hpp -index 23acf3622..333eb7bfd 100644 ---- a/libdnf/repo/Repo-private.hpp -+++ b/libdnf/repo/Repo-private.hpp -@@ -43,6 +43,7 @@ - - #include - #include -+#include - #include - - #include -@@ -177,6 +178,10 @@ class Repo::Impl { - int main_nrepodata{0}; - int main_end{0}; - -+ // Lock attachLibsolvRepo(), detachLibsolvRepo() and hy_repo_free() to ensure atomic behavior -+ // in threaded environment such as PackageKit. -+ std::mutex attachLibsolvMutex; -+ - private: - Repo * owner; - std::unique_ptr lrHandlePerform(LrHandle * handle, const std::string & destDirectory, -diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp -index fd2415fa5..86531fe9b 100644 ---- a/libdnf/repo/Repo.cpp -+++ b/libdnf/repo/Repo.cpp -@@ -60,7 +60,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -1335,8 +1334,10 @@ LrHandle * Repo::Impl::getCachedHandle() - - void Repo::Impl::attachLibsolvRepo(LibsolvRepo * libsolvRepo) - { -+ std::lock_guard guard(attachLibsolvMutex); -+ assert(!this->libsolvRepo); - ++nrefs; -- libsolvRepo->appdata = owner; -+ libsolvRepo->appdata = owner; // The libsolvRepo references back to us. - libsolvRepo->subpriority = -owner->getCost(); - libsolvRepo->priority = -owner->getPriority(); - this->libsolvRepo = libsolvRepo; -@@ -1344,11 +1345,23 @@ void Repo::Impl::attachLibsolvRepo(LibsolvRepo * libsolvRepo) - - void Repo::Impl::detachLibsolvRepo() - { -- libsolvRepo->appdata = nullptr; -- if (--nrefs > 0) -- this->libsolvRepo = nullptr; -- else -+ attachLibsolvMutex.lock(); -+ if (!libsolvRepo) { -+ // Nothing to do, libsolvRepo is not attached. -+ attachLibsolvMutex.unlock(); -+ return; -+ } -+ -+ libsolvRepo->appdata = nullptr; // Removes reference to this object from libsolvRepo. -+ this->libsolvRepo = nullptr; -+ -+ if (--nrefs <= 0) { -+ // There is no reference to this object, we are going to destroy it. -+ // Mutex is part of this object, we must unlock it before destroying. -+ attachLibsolvMutex.unlock(); - delete owner; -+ } else -+ attachLibsolvMutex.unlock(); - } - - void Repo::setMaxMirrorTries(int maxMirrorTries) -@@ -2057,7 +2070,12 @@ hy_repo_get_string(HyRepo repo, int which) - void - hy_repo_free(HyRepo repo) - { -- if (--libdnf::repoGetImpl(repo)->nrefs > 0) -- return; -+ auto repoImpl = libdnf::repoGetImpl(repo); -+ { -+ std::lock_guard guard(repoImpl->attachLibsolvMutex); -+ if (--repoImpl->nrefs > 0) -+ return; // There is still a reference to this object. Don't destroy it. -+ } -+ assert(!repoImpl->libsolvRepo); - delete repo; - } - -From 3a61d4c590612427bfeb7302236e4429acae90b0 Mon Sep 17 00:00:00 2001 -From: Jaroslav Rohel -Date: Fri, 12 Jul 2019 11:21:48 +0200 -Subject: [PATCH 4/5] Fix: crash in repo_internalize_trigger() without HyRepo - attached - -The repo_internalize_trigger() uses needs_internalizing from HyRepo. -If HyRepo is not attached we will assume needs_internalizing==true. ---- - libdnf/repo/Repo.cpp | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp -index 86531fe9b..210ecde8f 100644 ---- a/libdnf/repo/Repo.cpp -+++ b/libdnf/repo/Repo.cpp -@@ -1826,15 +1826,19 @@ repo_internalize_all_trigger(Pool *pool) - void - repo_internalize_trigger(Repo * repo) - { -- if (repo) { -- auto hrepo = static_cast(repo->appdata); -+ if (!repo) -+ return; -+ -+ if (auto hrepo = static_cast(repo->appdata)) { -+ // HyRepo is attached. The hint needs_internalizing will be used. - auto repoImpl = libdnf::repoGetImpl(hrepo); - assert(repoImpl->libsolvRepo == repo); - if (!repoImpl->needs_internalizing) - return; - repoImpl->needs_internalizing = false; -- repo_internalize(repo); - } -+ -+ repo_internalize(repo); - } - - void - -From e4cabf803e1dbb6283330636d06ccb4a26e89ad4 Mon Sep 17 00:00:00 2001 -From: Jaroslav Rohel -Date: Sun, 14 Jul 2019 10:45:27 +0200 -Subject: [PATCH 5/5] [Repo] attachLibsolvRepo() can reattach repo to another - libsolvRepo - ---- - 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 210ecde8f..70c6a7411 100644 ---- a/libdnf/repo/Repo.cpp -+++ b/libdnf/repo/Repo.cpp -@@ -1335,8 +1335,14 @@ LrHandle * Repo::Impl::getCachedHandle() - void Repo::Impl::attachLibsolvRepo(LibsolvRepo * libsolvRepo) - { - std::lock_guard guard(attachLibsolvMutex); -- assert(!this->libsolvRepo); -- ++nrefs; -+ -+ if (this->libsolvRepo) -+ // A libsolvRepo was attached to this object before. Remove it's reference to this object. -+ this->libsolvRepo->appdata = nullptr; -+ else -+ // The libsolvRepo will reference this object. Increase reference counter. -+ ++nrefs; -+ - libsolvRepo->appdata = owner; // The libsolvRepo references back to us. - libsolvRepo->subpriority = -owner->getCost(); - libsolvRepo->priority = -owner->getPriority(); diff --git a/libdnf.spec b/libdnf.spec index 52f8ab0..d452bf3 100644 --- a/libdnf.spec +++ b/libdnf.spec @@ -37,8 +37,8 @@ %{nil} Name: libdnf -Version: 0.35.1 -Release: 4%{?dist} +Version: 0.35.3 +Release: 1%{?dist} Summary: Library providing simplified C and Python API to libsolv License: LGPLv2+ URL: https://github.com/rpm-software-management/libdnf @@ -47,9 +47,6 @@ Patch0001: 0001-Revert-9309e92332241ff1113433057c969cebf127734e.patch # Temporary patch to not fail on modular RPMs without modular metadata # until the infrastructure is ready Patch0002: 0002-Revert-consequences-of-Fail-Safe-mechanism.patch -# https://bugzilla.redhat.com/show_bug.cgi?id=1727343 -# https://bugzilla.redhat.com/show_bug.cgi?id=1727424 -Patch0003: 0003-Fix-attaching-and-detaching-of-libsolvRepo.patch BuildRequires: cmake BuildRequires: gcc @@ -79,6 +76,16 @@ Requires: libmodulemd%{?_isa} >= %{libmodulemd_version} Requires: libsolv%{?_isa} >= %{libsolv_version} Requires: librepo%{?_isa} >= %{librepo_version} +%if %{without python2} +# Obsoleted from here so we can track the fast growing version easily. +# We intentionally only obsolete and not provide, this is a broken upgrade +# prevention, not providing the removed functionality. +Obsoletes: python2-%{name} < %{version}-%{release} +Obsoletes: python2-hawkey < %{version}-%{release} +Obsoletes: python2-hawkey-debuginfo < %{version}-%{release} +Obsoletes: python2-libdnf-debuginfo < %{version}-%{release} +%endif + %description A Library providing simplified C and Python API to libsolv. @@ -231,6 +238,8 @@ popd %license COPYING %doc README.md AUTHORS %{_libdir}/%{name}.so.* +%dir %{_libdir}/libdnf/ +%dir %{_libdir}/libdnf/plugins/ %{_libdir}/libdnf/plugins/README %files devel @@ -260,6 +269,19 @@ popd %endif %changelog +* Tue Aug 13 2019 Pavla Kratochvilova - 0.35.3-1 +- Update to 0.35.3 +- Make libdnf own its plugin directory (RhBug:1714265) +- Don't disable nonexistent but required repositories (RhBug:1689331) +- Set priority of dnf.conf.d drop-ins +- Fix toString() to not insert [] (RhBug:1584442) +- Ignore trailing blank lines in config (RhBug:1722493) +- Fix handling large number of filenames on input (RhBug:1690915) +- Detect armv7 with crypto extension only on arm version >= 8 +- A new standardized User-Agent field consisting of the libdnf and OS version + (including the variant) (RhBug:1156007) +- Add basic countme support (RhBug:1647454) + * Mon Jul 29 2019 Pavla Kratochvilova - 0.35.1-4 - Rebuilt for librepo 1.10.5 diff --git a/sources b/sources index 5d3e740..4b6e6b4 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (libdnf-0.35.1.tar.gz) = a83fc170624af8ae4df1eb82a1a5df3e9b1b51d27b8cc2e032d2826ef4f7684da0364f937141c577f038215de02fc4442c67d6365cc0ce0ad92b18694faab8d9 +SHA512 (libdnf-0.35.3.tar.gz) = 833f2b814d6f8e99f07d1fc45fb099e434456aff87c6e96d91018e089ea05a560ea73f4922a3fc3ae77a9ea845528336214ec55b88874ddd6b99abd308e4f153