summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2019-12-18 14:25:21 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2019-12-23 23:17:59 -0800
commit91ea90c25347a33ab4b7f7d7d390af048b4ab809 (patch)
tree86e67846580ca8359a938023edccdb4b3d6f0168 /lib
parent5bdba9883735eb64a5d598f95bb774637e27e9db (diff)
downloadspack-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`.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/environment.py18
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."""