-
Notifications
You must be signed in to change notification settings - Fork 91
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support repo's Appstream data download and install #1844
base: main
Are you sure you want to change the base?
Conversation
c067fd1
to
a261aa3
Compare
Hrm, the CI either needs to add |
a261aa3
to
10f8055
Compare
We do not want AppStream data being downloaded by default, as it's quite huge, so only callers that can do something with that data should request it. |
It's not that you (the caller) only can work with it, the Appstream data is installed system wide (to /var/cache/swcatalog/...), where any Appstream-capable app can use it. Preparing it beforehand makes sense, no? Or do you mean, in the "we" distro, when there's no gnome-software nor KDE Discover, there's also no PacakgeKit (which downloads and installs the appstream data unconditionally)? Note these are only the GUI apps I know of, which consume the appstream data. The |
I looked around, and please correct me if I'm wrong, because I can be wrong, it seems to me the CI is located in a separate project, in the https://github.com/rpm-software-management/ci-dnf-stack . I looked briefly into it, but I realized it's a blackbox for me, I even do not see the build parameters to be applied there. I'm sorry. |
Right, If PackageKit-DNF5 or GNOME Software through dnf5daemon want it, they can ask for it to be downloaded. But the regular dnf5 and dnf5daemon CLI can't do anything with it, so it's not useful to download. |
10f8055
to
bdaa04d
Compare
While I agree, I also do not think it would be helpful. It's the same as if you would want from the PackageKit to not download and install the appstream data from the repository metadata - it cannot be done. This is better than PackageKit, because with dnf and PackageKit on one machine you've duplicated the repo data in the local cache, which is bad (no PackageKit => half repo data stored on the machine). Could you point me to a repo, which provides that large appstream data, please? I've been in an impression that the distros provide its appstream data in certain packages, not as the repo metadata. Fedora has Is it possible we are talking about different things? |
If the |
I agree with @Conan-Kudo, I really don't think we should download it by default.
I don't think this would be a problem, by default we already download just In my option this could fit well into the |
Yes, it is located in Though I think we should discuss if it should be a dependency of libdnf, that is if the install should be done by libdnf. This is related to the other comments but since libdnf is not using the metadata it would make more sense to me if the install was done by the client that requested it. |
Okay. In that case I'd need access to the metadata itself from the client (through the dnf5daemon). Either to the Alternatively, a new API to list provided metadata by respective repo, then a new API to download chosen types, which would result in a list of full path names for the places where it had been downloaded. Ideally allow download in bulk, a list of the types to be downloaded resulting in a list of the filenames. Alternatively, anything you think would be better and would work for you. Let me know which it is, please, and I can try to update the merge request accordingly, or pass it to someone whom knows the internals of the dnf5 better than me (I know basically nothing). Thanks in advance. |
I was thinking the client would just add something like This would probably needed additional work to handle the fact that its multiple files with unknown type with prefix This is just my idea, I will bring it up on our team meeting today. |
That would work for me. It's close to the second suggestion, but not exactly the same. |
Maybe, to not need from the libdnf to decide whether it's prefix/suffix/wildcard/regex/..., to just list downloaded (or all) metadata types from the repomd.xml file, which the caller can "filter" as it needs to and then it'll ask for the paths to those interesting to it. |
I realized the list of the downloaded appstream data is useless, because the client usually runs in the user space and cannot write to the Nonetheless, I went with the config approach. The client can ask to use the repo's appstream data by the The just added commit is not complete, it doesn't work, I'll be looking on it. It seems like I cannot just pick "everything appstream*/appdata*" easily (the added change is about that, see the commit message), thus I might end up with a list of the possible types to be read, which is sad. |
At least this will make the code simpler for the PackageKit DNF5 backend too, I don't have to manually download the appstream data. 😄 |
4d87555
to
86d6203
Compare
86d6203
to
1f64c2d
Compare
I've another go on this. This time:
I tested that this works as expected also for a case when another client reads the repository data without the P.S.: I do not see in this confusing GitHub interface how to set a Draft flag on this merge request; could anyone unset it, please? |
There is "Ready for review" button down under the checks. I've pressed it :) |
1f64c2d
to
c46d964
Compare
Hmm, I guess there might be another button to let me move it to draft again (which I do not want to), but I do not see it there. Either it does not look like a button, or it's named somehow oddly, or I'm stupid. I'm definitely not blind (yet) ;) |
The move it to draft link is at the top right under the list of Reviewers. |
I see, a tiny grey link, on a very different place than the other button. Confusing from the start. Anyway, thanks for the pointers. |
0760884
to
12f0f72
Compare
Repositories can provide Appstream data for the packages they contain. This Appstream data is consumed by applications like the GNOME Software or KDE Discover, thus the users can see the packages (apps) in them. This is to be in pair with PackageKit, which does download and install the repo's Appstream data. As this adds a dependency on the `appstream` library, there is also a CMake option WITH_APPSTREAM to be able to turn the support off. The support is built by default, but the Appstream data is not downloaded unless "optional_metadata_types" config option contains "appstream". Closes rpm-software-management#1564
12f0f72
to
6fb904c
Compare
The only last thing I am thinking about is the |
These are the dependencies of appstream library:
|
The libxmlb.so.2 libstemmer.so.0 libappstream.so are the new dependencies for sure. Whether also libyaml-0.so and libzstd.so.1 I do not know. The others are "always there", I believe.
says |
Would it be acceptable if I add a new method to the /// The repo_loaded hook.
/// It is called when a single repository had been loaded (in Impl).
virtual void repo_loaded(Repo * repo); which I'd call in the place where There is that The alternative of traversing all repos (enabled/disabled/broken/...) and check whether the cache has the appstream data and install it if exists is also possible and I can go by that route as the starter, it only feels performance heavy on the first look. |
@@ -4,3 +4,7 @@ set(CMAKE_C_VISIBILITY_PRESET hidden) | |||
add_subdirectory("actions") | |||
add_subdirectory("python_plugins_loader") | |||
add_subdirectory("rhsm") | |||
|
|||
if(WITH_APPSTREAM) | |||
add_subdirectory("appstream") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It works, the Appstream data is installed as expected, with "one little caveat": when a session ends (on the dnf5daemon-server side), you also destroy the plugin class (which is fine), but you also unload the module (.so file). It breaks glib internals, because when another session opens and loads the plugin and calls the appstream library function, the glib aborts the dnf5daemon-server with:
(process:49835): GLib-GObject-CRITICAL **: 15:47:52.469: cannot register existing type 'AsMetadata'
(process:49835): GLib-GObject-CRITICAL **: 15:47:52.469: cannot add private field to invalid (non-instantiatable) type '<invalid>'
(process:49835): GLib-CRITICAL **: 15:47:52.469: g_once_init_leave_pointer: assertion 'result != 0' failed
(process:49835): GLib-GObject-CRITICAL **: 15:47:52.469: g_object_new_with_properties: assertion 'G_TYPE_IS_OBJECT (object_type)' failed
Segmentation fault (core dumped)
This does not exhibit when there's at least one session always loaded, which keeps the plugin module loaded in the memory, thus the glib type system is left in tact.
Is the plugin module unload really needed? I guess it can break more than just glib, it can break anything what stores some global data.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see. So this issue is related to the code that loads and unloads shared libraries here.
Could we simply solve this by passing RTLD_NODELETE
during the library's dlopen
to prevent unloading the libraries for the duration of the daemon's lifetime? Alternatively, should this be conditional for specific plugins only? Another approach could be to implement custom logic to unload libraries when the daemon terminates. @m-blaha @jrohel, could you please share your thoughts on this?
This allows to split out the appstream library dependency into a separate package, not adding it and its dependencies into the core part of the libdnf5.
ad24ee0
to
a575c38
Compare
repo::RepoQuery repos(base); | ||
repos.filter_enabled(true); | ||
for (const auto & repo : repos) { | ||
switch (repo->get_type()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is minor, but I would rather do:
auto type = repo->get_type();
if (type == repo::Repo::Type::AVAILABLE || type == repo::Repo::Type::SYSTEM) {
install_appstream(repo.get());
}
@@ -143,6 +144,9 @@ BuildRequires: bash-completion | |||
BuildRequires: cmake | |||
BuildRequires: doxygen | |||
BuildRequires: gettext | |||
%if %{with appstream} | |||
BuildRequires: pkgconfig(appstream) >= 0.16 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be moved inside the libdnf5-plugin-appstream
package, right? Otherwise the dnf5 itself would depend on appstream.
@@ -34,6 +34,7 @@ option(WITH_COMPS "Build with comps groups and environments support" ON) | |||
option(WITH_MODULEMD "Build with modulemd modules support" ON) | |||
option(WITH_ZCHUNK "Build with zchunk delta compression support" ON) | |||
option(WITH_SYSTEMD "Build with systemd and D-Bus features" ON) | |||
option(WITH_APPSTREAM "Build with appstream support" ON) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please rename it to WITH_PLUGIN_APPSTREAM
and move a bit up together with other plugins.
@@ -129,6 +130,10 @@ if (WITH_MODULEMD) | |||
add_definitions(-DWITH_MODULEMD) | |||
endif() | |||
|
|||
if (WITH_APPSTREAM) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should be dropped now.
@@ -4,3 +4,7 @@ set(CMAKE_C_VISIBILITY_PRESET hidden) | |||
add_subdirectory("actions") | |||
add_subdirectory("python_plugins_loader") | |||
add_subdirectory("rhsm") | |||
|
|||
if(WITH_APPSTREAM) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add the subdirectory unconditionally and move the condition within the appstream/CMakeLists.txt like it is done e.g. for actions plugin.
} | ||
#ifdef WITH_APPSTREAM |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, we can probably drop this conditional in the end as it is now in a separate plugin. There is not anyway anything dependent on the appstream library.
Repositories can provide Appstream data for the packages they contain. This Appstream data is consumed by applications like gnome-software or KDE Discover, thus the users can see the packages (apps) in them.
This is to be in pair with PackageKit, which does download and install the repo's Appstream data.
As this adds a dependency on the
appstream
library, there is also a CMake option WITH_APPSTREAM to be able to turn the support off. The support is enabled by default.That is, the
/var/cache/libdnf5/$REPO_NAME/repodata/
directory can have downloaded also files withappstream
in their name and, when installed, the data is stored under/var/cache/swcatalog/xml/
.CC @m-blaha @jan-kolarik