-
Notifications
You must be signed in to change notification settings - Fork 93
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. |
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. |
libdnf5-plugins/CMakeLists.txt
Outdated
@@ -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?
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 know I'm not asked here, but if I can add my opinion, then I believe the RTLD_NODELETE
is a good thing to add. As the plugins are loaded only inside the deamon, they are freed together with the deamon too. Not within the session object the deamon creates, which is good and intentional.
I gave it a try and it works as expected, no more crash of the dnf5-daemon process and no runtime warnings either. See the added (second) commit. I cleaned up the commits too, the merge request is ready for the final review now.
ad24ee0
to
a575c38
Compare
a575c38
to
7bbd7c5
Compare
Repositories can provide Appstream data for the packages they contain. This Appstream data is consumed by applications like the GNOME Software or the 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. The plugin is built by default, but the Appstream data is not downloaded unless "optional_metadata_types" config option contains "appstream". The plugin adds a dependency on the `appstream` library. It can be disabled with a WITH_PLUGIN_APPSTREAM CMake option set to OFF. Closes rpm-software-management#1564
Some plugins can use libraries, which have saved global data and unloading such library can break this global data in a way which can cause a crash of the daemon. One such library is glib, where this unload can break its type system, with this shown on the dnf5daemon process console when it happens: ``` (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) ```
7bbd7c5
to
cde45bc
Compare
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