diff options
author | Todd Gamblin <tgamblin@llnl.gov> | 2019-12-18 14:25:21 -0800 |
---|---|---|
committer | Todd Gamblin <tgamblin@llnl.gov> | 2019-12-23 23:17:59 -0800 |
commit | 91ea90c25347a33ab4b7f7d7d390af048b4ab809 (patch) | |
tree | 86e67846580ca8359a938023edccdb4b3d6f0168 | |
parent | 5bdba9883735eb64a5d598f95bb774637e27e9db (diff) | |
download | spack-91ea90c25347a33ab4b7f7d7d390af048b4ab809.tar.gz spack-91ea90c25347a33ab4b7f7d7d390af048b4ab809.tar.bz2 spack-91ea90c25347a33ab4b7f7d7d390af048b4ab809.tar.xz spack-91ea90c25347a33ab4b7f7d7d390af048b4ab809.zip |
performance: speed up `spack find` in environments
`Environment.added_specs()` has a loop around calls to
`Package.installed()`, which can result in repeated DB queries. Optimize
this with a read transaction in `Environment`.
-rw-r--r-- | lib/spack/spack/environment.py | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index 2c7a0cf098..4a23c52622 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -25,6 +25,7 @@ import spack.hash_types as ht import spack.repo import spack.schema.env import spack.spec +import spack.store import spack.util.spack_json as sjson import spack.util.spack_yaml as syaml import spack.config @@ -1232,13 +1233,16 @@ class Environment(object): Yields the user spec for non-concretized specs, and the concrete spec for already concretized but not yet installed specs. """ - concretized = dict(self.concretized_specs()) - for spec in self.user_specs: - concrete = concretized.get(spec) - if not concrete: - yield spec - elif not concrete.package.installed: - yield concrete + # use a transaction to avoid overhead of repeated calls + # to `package.installed` + with spack.store.db.read_transaction(): + concretized = dict(self.concretized_specs()) + for spec in self.user_specs: + concrete = concretized.get(spec) + if not concrete: + yield spec + elif not concrete.package.installed: + yield concrete def concretized_specs(self): """Tuples of (user spec, concrete spec) for all concrete specs.""" |