summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2019-12-20 23:38:23 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2019-12-23 23:18:44 -0800
commita85b9070cb37103c45e0e9b58732b4d92c09288b (patch)
tree2bd827618cec137f1f9ac535cbfa4f3d5567ad55 /lib
parent91ea90c25347a33ab4b7f7d7d390af048b4ab809 (diff)
downloadspack-a85b9070cb37103c45e0e9b58732b4d92c09288b.tar.gz
spack-a85b9070cb37103c45e0e9b58732b4d92c09288b.tar.bz2
spack-a85b9070cb37103c45e0e9b58732b4d92c09288b.tar.xz
spack-a85b9070cb37103c45e0e9b58732b4d92c09288b.zip
performance: avoid repeated DB locking on view generation
`ViewDescriptor.regenerate()` checks repeatedly whether packages are installed and also does a lot of DB queries. Put a read transaction around the whole thing to avoid repeatedly locking and unlocking the DB.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/environment.py23
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py
index 4a23c52622..f7a1310459 100644
--- a/lib/spack/spack/environment.py
+++ b/lib/spack/spack/environment.py
@@ -516,20 +516,23 @@ class ViewDescriptor(object):
if spec.concrete: # Do not link unconcretized roots
specs_for_view.append(spec.copy(deps=('link', 'run')))
- installed_specs_for_view = set(s for s in specs_for_view
- if s in self and s.package.installed)
+ # regeneration queries the database quite a bit; this read
+ # transaction ensures that we don't repeatedly lock/unlock.
+ with spack.store.db.read_transaction():
+ installed_specs_for_view = set(
+ s for s in specs_for_view if s in self and s.package.installed)
- view = self.view()
+ view = self.view()
- view.clean()
- specs_in_view = set(view.get_all_specs())
- tty.msg("Updating view at {0}".format(self.root))
+ view.clean()
+ specs_in_view = set(view.get_all_specs())
+ tty.msg("Updating view at {0}".format(self.root))
- rm_specs = specs_in_view - installed_specs_for_view
- view.remove_specs(*rm_specs, with_dependents=False)
+ rm_specs = specs_in_view - installed_specs_for_view
+ view.remove_specs(*rm_specs, with_dependents=False)
- add_specs = installed_specs_for_view - specs_in_view
- view.add_specs(*add_specs, with_dependencies=False)
+ add_specs = installed_specs_for_view - specs_in_view
+ view.add_specs(*add_specs, with_dependencies=False)
class Environment(object):