summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-01-05 17:41:28 -0800
committerZac Medico <zmedico@gentoo.org>2011-01-05 17:54:14 -0800
commitf6b93817c533f829f3aee4fd7bbbdb4936e80036 (patch)
tree06a2938d4215bef0e476660bdc909d193035aace
parentemerge-webrsync: eat trailing newlines (diff)
downloadportage-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.py21
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