summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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."""