summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2021-02-05 23:34:18 -0800
committerMassimiliano Culpo <massimiliano.culpo@gmail.com>2021-02-11 15:30:57 +0100
commit52508e6ee7caab8a9987f40350a9ed5b571ee656 (patch)
treea5a31f9a9037e8346e7f9503fb1241693f74645f
parent6fe931ccb1bfd9cbd17db167778517600b3857ce (diff)
downloadspack-52508e6ee7caab8a9987f40350a9ed5b571ee656.tar.gz
spack-52508e6ee7caab8a9987f40350a9ed5b571ee656.tar.bz2
spack-52508e6ee7caab8a9987f40350a9ed5b571ee656.tar.xz
spack-52508e6ee7caab8a9987f40350a9ed5b571ee656.zip
database: do not redundantly mark specs concrete
Speed up reads by not traversing each spec recursively when marking them concrete.
-rw-r--r--lib/spack/spack/database.py2
-rw-r--r--lib/spack/spack/spec.py12
2 files changed, 9 insertions, 5 deletions
diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py
index 0183df167b..0efaab9eb0 100644
--- a/lib/spack/spack/database.py
+++ b/lib/spack/spack/database.py
@@ -795,7 +795,7 @@ class Database(object):
# do it *while* we're constructing specs,it causes hashes to be
# cached prematurely.
for hash_key, rec in data.items():
- rec.spec._mark_concrete()
+ rec.spec._mark_root_concrete()
self._data = data
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 985236bf6d..5986cf8e18 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -2538,6 +2538,13 @@ class Spec(object):
else:
self._old_concretize(tests)
+ def _mark_root_concrete(self, value=True):
+ """Mark just this spec (not dependencies) concrete."""
+ if (not value) and self.concrete and self.package.installed:
+ return
+ self._normal = value
+ self._concrete = value
+
def _mark_concrete(self, value=True):
"""Mark this spec and its dependencies as concrete.
@@ -2545,10 +2552,7 @@ class Spec(object):
unless there is a need to force a spec to be concrete.
"""
for s in self.traverse():
- if (not value) and s.concrete and s.package.installed:
- continue
- s._normal = value
- s._concrete = value
+ s._mark_root_concrete(value)
def concretized(self, tests=False):
"""This is a non-destructive version of concretize().