diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-01-05 17:41:28 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-01-05 17:54:14 -0800 |
commit | f6b93817c533f829f3aee4fd7bbbdb4936e80036 (patch) | |
tree | 06a2938d4215bef0e476660bdc909d193035aace | |
parent | d5a97eb4ec98c6721ed2692dbe0ef2097b14acd7 (diff) | |
download | portage-f6b93817c533f829f3aee4fd7bbbdb4936e80036.tar.gz portage-f6b93817c533f829f3aee4fd7bbbdb4936e80036.tar.bz2 portage-f6b93817c533f829f3aee4fd7bbbdb4936e80036.zip |
Scheduler: cache Package instance more
This helps to avoid some cases in which emerge crashes due to ebuild
modification that leads to failure in aux_get/manifest check while
the Scheduler is running. Typically such modifications are harmless,
so it's beneficial to cache the metadata so that aux_get is less
likely to be called when it will fail.
-rw-r--r-- | pym/_emerge/Scheduler.py | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 89313e883..5cead54ec 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -433,12 +433,14 @@ class Scheduler(PollScheduler): if graph_config is None: self._graph_config = None + self._pkg_cache = {} self._digraph = None self._mergelist = [] self._deep_system_deps.clear() return self._graph_config = graph_config + self._pkg_cache = graph_config.pkg_cache self._digraph = graph_config.graph self._mergelist = graph_config.mergelist @@ -1988,18 +1990,19 @@ class Scheduler(PollScheduler): if installed: operation = "nomerge" - if self._digraph is not None: - # Reuse existing instance when available. - pkg = self._digraph.get( - (type_name, root_config.root, cpv, operation)) - if pkg is not None: - return pkg + # Reuse existing instance when available. + pkg = self._pkg_cache.get( + (type_name, root_config.root, cpv, operation)) + if pkg is not None: + return pkg tree_type = depgraph.pkg_tree_map[type_name] db = root_config.trees[tree_type].dbapi db_keys = list(self.trees[root_config.root][ tree_type].dbapi._aux_cache_keys) metadata = zip(db_keys, db.aux_get(cpv, db_keys)) - return Package(built=(type_name != 'ebuild'), - cpv=cpv, metadata=metadata, - root_config=root_config, installed=installed) + pkg = Package(built=(type_name != "ebuild"), + cpv=cpv, installed=installed, metadata=metadata, + root_config=root_config, type_name=type_name) + self._pkg_cache[pkg] = pkg + return pkg |