1
0
forked from rpms/PackageKit

Fix parallel kernel package installation

This commit is contained in:
Kalev Lember 2014-05-13 13:42:12 +02:00
parent 309307a7bc
commit eb8e0c72ec
2 changed files with 193 additions and 1 deletions

View File

@ -0,0 +1,186 @@
From 6c7960abf6f3d3ccb498c502d7f4d531563f3d7d Mon Sep 17 00:00:00 2001
From: Kalev Lember <kalevlember@gmail.com>
Date: Mon, 12 May 2014 21:40:35 +0200
Subject: [PATCH] hif: Reimplement multiple kernel package installation
We had existing code that allowed us to keep multiple kernel packages
installed, but this had broken at some point. This commit reimplements it using
current hawkey API, simplifying code and making it work again.
Signed-off-by: Richard Hughes <richard@hughsie.com>
---
backends/hawkey/pk-backend-hawkey.c | 130 +++++++++++++++---------------------
1 file changed, 53 insertions(+), 77 deletions(-)
diff --git a/backends/hawkey/pk-backend-hawkey.c b/backends/hawkey/pk-backend-hawkey.c
index 16d2d86..74ff632 100644
--- a/backends/hawkey/pk-backend-hawkey.c
+++ b/backends/hawkey/pk-backend-hawkey.c
@@ -652,6 +652,50 @@ out:
return ret;
}
+/**
+ * hif_utils_get_installonly_pkgs:
+ */
+static const gchar **
+hif_utils_get_installonly_pkgs (void)
+{
+ static const gchar *installonly_pkgs[] = { "kernel",
+ "installonlypkg(kernel)",
+ "installonlypkg(kernel-module)",
+ "installonlypkg(vm)",
+ NULL };
+ return installonly_pkgs;
+}
+
+/**
+ * hif_utils_get_installonly_limit:
+ */
+static int
+hif_utils_get_installonly_limit (void)
+{
+ return 3;
+}
+
+/**
+ * hif_package_is_installonly:
+ */
+static gboolean
+hif_package_is_installonly (HyPackage pkg)
+{
+ const gchar **installonly_pkgs;
+ const gchar *pkg_name;
+ guint i;
+
+ installonly_pkgs = hif_utils_get_installonly_pkgs ();
+ pkg_name = hy_package_get_name (pkg);
+
+ for (i = 0; installonly_pkgs[i] != NULL; i++) {
+ if (g_strcmp0 (pkg_name, installonly_pkgs[i]) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
typedef enum {
HIF_CREATE_SACK_FLAG_NONE,
HIF_CREATE_SACK_FLAG_USE_CACHE,
@@ -4247,65 +4291,6 @@ pk_backend_install_files (PkBackend *backend, PkBackendJob *job,
}
/**
- * hy_package_evr_sort_newest_cb:
- */
-static gint
-hy_package_evr_sort_newest_cb (gconstpointer a, gconstpointer b)
-{
- HyPackage *pa = (HyPackage *) a;
- HyPackage *pb = (HyPackage *) b;
- return -hy_package_evr_cmp (*pa, *pb);
-}
-
-/**
- * hif_goal_erase_only_n:
- */
-static void
-hif_goal_erase_only_n (HyGoal goal,
- HySack sack_installed,
- const gchar *package_name,
- guint only_n)
-{
- GPtrArray *array = NULL;
- HyPackageList pkglist = NULL;
- HyPackage pkg;
- HyQuery query = NULL;
- guint i;
-
- /* run query */
- query = hy_query_create (sack_installed);
- hy_query_filter (query, HY_PKG_NAME, HY_EQ, package_name);
- hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME);
- pkglist = hy_query_run (query);
-
- /* any matches? */
- if ((guint) hy_packagelist_count (pkglist) < only_n) {
- g_debug ("only %i %s packages, not removing any",
- hy_packagelist_count (pkglist), package_name);
- goto out;
- }
-
- /* remove the oldest */
- array = g_ptr_array_new ();
- FOR_PACKAGELIST (pkg, pkglist, i)
- g_ptr_array_add (array, pkg);
- g_ptr_array_sort (array, hy_package_evr_sort_newest_cb);
- for (i = 0; i < array->len; i++) {
- pkg = g_ptr_array_index (array, i);
- if (i >= only_n - 1) {
- g_debug ("removing %s", hif_package_get_nevra (pkg));
- hy_goal_erase (goal, pkg);
- }
- }
-
-out:
- if (array != NULL)
- g_ptr_array_unref (array);
- hy_packagelist_free (pkglist);
- hy_query_free (query);
-}
-
-/**
* pk_backend_update_packages_thread:
*/
static void
@@ -4321,11 +4306,6 @@ pk_backend_update_packages_thread (PkBackendJob *job, GVariant *params, gpointer
gboolean ret;
gchar **package_ids;
guint i;
- guint j;
- const gchar *only_n_pkgnames[] = { "kernel",
- "kernel-source",
- "kernel-devel",
- NULL };
g_variant_get (params, "(t^a&s)",
&job_data->transaction_flags,
@@ -4357,6 +4337,10 @@ pk_backend_update_packages_thread (PkBackendJob *job, GVariant *params, gpointer
goto out;
}
+ /* set up the sack for packages that should only ever be installed, never updated */
+ hy_sack_set_installonly (sack, hif_utils_get_installonly_pkgs ());
+ hy_sack_set_installonly_limit (sack, hif_utils_get_installonly_limit ());
+
/* done */
ret = hif_state_done (job_data->state, &error);
if (!ret) {
@@ -4415,19 +4399,11 @@ pk_backend_update_packages_thread (PkBackendJob *job, GVariant *params, gpointer
}
hif_package_set_user_action (pkg, TRUE);
- /* allow some packages to have multiple versions installed,
- * but remove any older than the only_n limit */
- for (j = 0; only_n_pkgnames[j] != NULL; j++) {
- if (g_strcmp0 (hy_package_get_name (pkg),
- only_n_pkgnames[j]) == 0) {
- hy_goal_install (job_data->goal, pkg);
- hif_goal_erase_only_n (job_data->goal, sack,
- only_n_pkgnames[j],
- 5);
- } else {
- hy_goal_upgrade_to (job_data->goal, pkg);
- }
- }
+ /* allow some packages to have multiple versions installed */
+ if (hif_package_is_installonly (pkg))
+ hy_goal_install (job_data->goal, pkg);
+ else
+ hy_goal_upgrade_to (job_data->goal, pkg);
}
/* run transaction */
--
1.9.0

View File

@ -9,13 +9,15 @@
Summary: Package management service
Name: PackageKit
Version: 0.9.2
Release: 1%{?dist}
Release: 2%{?dist}
License: GPLv2+ and LGPLv2+
URL: http://www.freedesktop.org/software/PackageKit/
Source0: http://www.freedesktop.org/software/PackageKit/releases/%{name}-%{version}.tar.xz
# Fedora-specific: set Vendor.conf up for Fedora.
Patch0: PackageKit-0.3.8-Fedora-Vendor.conf.patch
# Upstream fix for parallel kernel package installation
Patch1: 0001-hif-Reimplement-multiple-kernel-package-installation.patch
Requires: %{name}-glib%{?_isa} = %{version}-%{release}
Requires: shared-mime-info
@ -178,6 +180,7 @@ using PackageKit.
%setup -q
#%setup -q -n %{name}-%{version}-%{gitdate}
%patch0 -p1 -b .fedora
%patch1 -p1
%build
%configure \
@ -343,6 +346,9 @@ popd > /dev/null
%changelog
* Tue May 13 2014 Kalev Lember <kalevlember@gmail.com> - 0.9.2-2
- Fix parallel kernel package installation
* Tue Apr 29 2014 Richard Hughes <rhughes@redhat.com> - 0.9.2-1
- New upstream release
- Don't crash when polkit_authority_get_sync() fails