summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-10-14 19:01:39 -0700
committerZac Medico <zmedico@gentoo.org>2010-10-14 19:01:39 -0700
commite0cc5ef31f9459b3c1615ce45cbb48c27e1b178f (patch)
treea706d28f81586f4e57ceb0e464f1f19eb7fe6332 /pym
parent8f91b6615617af839a31e51bd3bb2048ea81ea56 (diff)
downloadportage-e0cc5ef31f9459b3c1615ce45cbb48c27e1b178f.tar.gz
portage-e0cc5ef31f9459b3c1615ce45cbb48c27e1b178f.tar.bz2
portage-e0cc5ef31f9459b3c1615ce45cbb48c27e1b178f.zip
Optimize uninstall selection in serialize_tasks.
This increases performance dramatically in cases when there are hundreds of blockers to solve, like when when upgrading to a new slot of kde-meta.
Diffstat (limited to 'pym')
-rw-r--r--pym/_emerge/depgraph.py15
1 files changed, 11 insertions, 4 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 31f97ec15..adef1193d 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -4168,9 +4168,6 @@ class depgraph(object):
min_parent_deps = None
uninst_task = None
- # FIXME: This loop can be extremely slow when
- # there of lots of blockers to solve
- # (especially the gather_deps part).
for task in myblocker_uninstalls.leaf_nodes():
# Do some sanity checks so that system or world packages
# don't get uninstalled inappropriately here (only really
@@ -4297,9 +4294,20 @@ class depgraph(object):
self._spinner_update()
mergeable_parent = False
parent_deps = set()
+ parent_deps.add(task)
for parent in mygraph.parent_nodes(task):
parent_deps.update(mygraph.child_nodes(parent,
ignore_priority=priority_range.ignore_medium_soft))
+ if min_parent_deps is not None and \
+ len(parent_deps) >= min_parent_deps:
+ # This task is no better than a previously selected
+ # task, so abort search now in order avoid wasting
+ # any more cpu time on this task. This increases
+ # performance dramatically in cases when there are
+ # hundreds of blockers to solve, like when
+ # when upgrading to a new slot of kde-meta.
+ mergeable_parent = None
+ break
if parent in mergeable_nodes and \
gather_deps(ignore_uninst_or_med_soft,
mergeable_nodes, set(), parent):
@@ -4308,7 +4316,6 @@ class depgraph(object):
if not mergeable_parent:
continue
- parent_deps.remove(task)
if min_parent_deps is None or \
len(parent_deps) < min_parent_deps:
min_parent_deps = len(parent_deps)