From eb8e0c72ec011b2e756039bf1fcd687a0d68ab79 Mon Sep 17 00:00:00 2001 From: Kalev Lember Date: May 13 2014 11:42:12 +0000 Subject: Fix parallel kernel package installation --- diff --git a/0001-hif-Reimplement-multiple-kernel-package-installation.patch b/0001-hif-Reimplement-multiple-kernel-package-installation.patch new file mode 100644 index 0000000..c791d4f --- /dev/null +++ b/0001-hif-Reimplement-multiple-kernel-package-installation.patch @@ -0,0 +1,186 @@ +From 6c7960abf6f3d3ccb498c502d7f4d531563f3d7d Mon Sep 17 00:00:00 2001 +From: Kalev Lember +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 +--- + 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 + diff --git a/PackageKit.spec b/PackageKit.spec index 65c9657..8d9e758 100644 --- a/PackageKit.spec +++ b/PackageKit.spec @@ -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 - 0.9.2-2 +- Fix parallel kernel package installation + * Tue Apr 29 2014 Richard Hughes - 0.9.2-1 - New upstream release - Don't crash when polkit_authority_get_sync() fails