proj/portage:master commit in: lib/_emerge/
"Matt Turner" <[email protected]>
| Newsgroups | gmane.linux.gentoo.cvs |
|---|---|
| Message-ID | <1786739750.03335401657a1bf68c0ef3ae01178e9dd1327ce0.mattst88@gentoo> |
commit: 03335401657a1bf68c0ef3ae01178e9dd1327ce0
Author: Matt Turner <mattst88 <AT> gentoo <DOT> org>
AuthorDate: Fri Aug 14 13:39:49 2026 +0000
Commit: Matt Turner <mattst88 <AT> gentoo <DOT> org>
CommitDate: Fri Aug 14 20:35:50 2026 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=03335401
depgraph: separate per-depgraph vdb load from the shared dynamic-deps apply
_load_vdb() mixed two kinds of work in one loop. Populating
_package_tracker and _installed_sonames touches _dynamic_config, which is
constructed anew for every backtracking depgraph, so it has to run on
every pass. Applying dynamic deps touches the FakeVartree, which lives in
frozen_config and is shared by every backtracking depgraph, so it only
has to run once per instance.
Split them. The tracker and soname loop now runs unconditionally, and
_dynamic_deps_preload() takes the list of instances that still need the
apply. When that list is empty, as it is for every backtracking depgraph,
the TaskScheduler is not constructed at all.
This is the same skip the previous commit added, with the two kinds of
state now separated in the code itself. No behavior change: an
"emerge -p -uDN @world" resolve against a root with 1736 installed
packages produces identical output, and the twelve already-applied passes
it performs cost about 2 ms each either way.
Signed-off-by: Matt Turner <mattst88 <AT> gentoo.org>
lib/_emerge/depgraph.py | 56 +++++++++++++++++++++++++++----------------------
1 file changed, 31 insertions(+), 25 deletions(-)
diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index 86196c8f0..bc5a0cd1b 100644
--- a/lib/_emerge/depgraph.py
+++ b/lib/_emerge/depgraph.py
@@ -913,36 +913,42 @@ class depgraph:
if preload_installed_pkgs:
vardb = fake_vartree.dbapi
- if not dynamic_deps:
- for pkg in vardb:
- self._dynamic_config._package_tracker.add_installed_pkg(pkg)
- self._add_installed_sonames(pkg)
- else:
- max_jobs = self._frozen_config.myopts.get("--jobs")
- max_load = self._frozen_config.myopts.get("--load-average")
- scheduler = TaskScheduler(
- self._dynamic_deps_preload(fake_vartree),
- max_jobs=max_jobs,
- max_load=max_load,
- event_loop=fake_vartree._portdb._event_loop,
- )
- scheduler.start()
- scheduler.wait()
+ # The package tracker and the installed-soname map belong to
+ # _dynamic_config, which is constructed anew for every
+ # backtracking depgraph, so they must be repopulated on every
+ # pass.
+ for pkg in vardb:
+ self._dynamic_config._package_tracker.add_installed_pkg(pkg)
+ self._add_installed_sonames(pkg)
+
+ if dynamic_deps:
+ # The FakeVartree, in contrast, belongs to frozen_config and
+ # is shared by every backtracking depgraph, so the
+ # dynamic-deps apply only has to run for the instances it
+ # has not already run for.
+ pending = [
+ pkg
+ for pkg in vardb
+ if not fake_vartree.dynamic_deps_applied(pkg)
+ ]
+ if pending:
+ max_jobs = self._frozen_config.myopts.get("--jobs")
+ max_load = self._frozen_config.myopts.get("--load-average")
+ scheduler = TaskScheduler(
+ self._dynamic_deps_preload(fake_vartree, pending),
+ max_jobs=max_jobs,
+ max_load=max_load,
+ event_loop=fake_vartree._portdb._event_loop,
+ )
+ scheduler.start()
+ scheduler.wait()
self._dynamic_config._vdb_loaded = True
- def _dynamic_deps_preload(self, fake_vartree):
+ def _dynamic_deps_preload(self, fake_vartree, pkgs):
portdb = fake_vartree._portdb
config_pool = []
- for pkg in fake_vartree.dbapi:
- self._dynamic_config._package_tracker.add_installed_pkg(pkg)
- self._add_installed_sonames(pkg)
- if fake_vartree.dynamic_deps_applied(pkg):
- # An earlier depgraph sharing this FakeVartree already applied
- # dynamic deps to this instance, and doing it again would only
- # re-derive the same result from metadata that first pass
- # rewrote.
- continue
+ for pkg in pkgs:
ebuild_path, repo_path = portdb.findname2(pkg.cpv, myrepo=pkg.repo)
if ebuild_path is None:
fake_vartree.dynamic_deps_preload(pkg, None)