From 4077ba3ea30354ef070d640a5af4b6a913e97f4b Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Tue, 18 Jun 2013 12:56:05 +0000 Subject: Ignore package progress updates when the transaction is being simulated PackageKit backends do not have to issue INFO_FINISHED when simulating, and most don't bother. As we didn't special-case simulation, we set up the activity spinner on the Package(INFO_UPDATING) event and do not cancel the signal. This leaves every row in the update viewer with a spinning cursor, which due to the way the code was structured lead to an O(n*n) exposion of updates to the cell renderers for each update. For a dozen or so updates it was not noticable, and nobody noticed the slight increase of CPU usage. Now that TeX Live has officially jumped the shark and has many hundreds of sub-packages, it's quite plausible to have *thousands* of small packages to update. This means that the O(n*n) bug stops being a minor increase in CPU and starts to use the CPU at 100% for many hours before completing. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=969852 --- diff --git a/src/gpk-update-viewer.c b/src/gpk-update-viewer.c index 53be9cf..a2182a1 100644 --- a/src/gpk-update-viewer.c +++ b/src/gpk-update-viewer.c @@ -841,6 +841,7 @@ gpk_update_viewer_progress_cb (PkProgress *progress, gchar *text; gint percentage; GtkWidget *widget; + guint64 transaction_flags; PkInfoEnum info; PkRoleEnum role; PkStatusEnum status; @@ -853,6 +854,7 @@ gpk_update_viewer_progress_cb (PkProgress *progress, "percentage", &percentage, "package", &package, "allow-cancel", &allow_cancel, + "transaction-flags", &transaction_flags, NULL); if (type == PK_PROGRESS_TYPE_PACKAGE) { @@ -864,6 +866,10 @@ gpk_update_viewer_progress_cb (PkProgress *progress, GtkTreePath *path; gboolean scroll; + /* ignore simulation phase */ + if (pk_bitfield_contain (transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) + goto out; + /* add the results, not the progress */ if (role == PK_ROLE_ENUM_GET_UPDATES) goto out; @@ -1040,6 +1046,10 @@ gpk_update_viewer_progress_cb (PkProgress *progress, guint size_display; PkItemProgress *item_progress; + /* ignore simulation phase */ + if (pk_bitfield_contain (transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) + goto out; + g_object_get (progress, "item-progress", &item_progress, NULL); -- cgit v0.9.2