Skip to content
Snippets Groups Projects
Commit 0fb32800 authored by Todd Gamblin's avatar Todd Gamblin
Browse files

performance: add read transactions for `install_all()` and `install()`

Environments need to read the DB a lot when installing all specs.

- [x] Put a read transaction around `install_all()` and `install()`
  to avoid repeated locking
parent 6c9467e8
No related branches found
No related tags found
No related merge requests found
...@@ -995,19 +995,22 @@ def install(self, user_spec, concrete_spec=None, **install_args): ...@@ -995,19 +995,22 @@ def install(self, user_spec, concrete_spec=None, **install_args):
spec = Spec(user_spec) spec = Spec(user_spec)
if self.add(spec): with spack.store.db.read_transaction():
concrete = concrete_spec if concrete_spec else spec.concretized() if self.add(spec):
self._add_concrete_spec(spec, concrete) concrete = concrete_spec or spec.concretized()
else:
# spec might be in the user_specs, but not installed.
# TODO: Redo name-based comparison for old style envs
spec = next(s for s in self.user_specs if s.satisfies(user_spec))
concrete = self.specs_by_hash.get(spec.build_hash())
if not concrete:
concrete = spec.concretized()
self._add_concrete_spec(spec, concrete) self._add_concrete_spec(spec, concrete)
else:
# spec might be in the user_specs, but not installed.
# TODO: Redo name-based comparison for old style envs
spec = next(
s for s in self.user_specs if s.satisfies(user_spec)
)
concrete = self.specs_by_hash.get(spec.build_hash())
if not concrete:
concrete = spec.concretized()
self._add_concrete_spec(spec, concrete)
self._install(concrete, **install_args) self._install(concrete, **install_args)
def _install(self, spec, **install_args): def _install(self, spec, **install_args):
spec.package.do_install(**install_args) spec.package.do_install(**install_args)
...@@ -1180,26 +1183,27 @@ def _add_concrete_spec(self, spec, concrete, new=True): ...@@ -1180,26 +1183,27 @@ def _add_concrete_spec(self, spec, concrete, new=True):
def install_all(self, args=None): def install_all(self, args=None):
"""Install all concretized specs in an environment.""" """Install all concretized specs in an environment."""
for concretized_hash in self.concretized_order: with spack.store.db.read_transaction():
spec = self.specs_by_hash[concretized_hash] for concretized_hash in self.concretized_order:
spec = self.specs_by_hash[concretized_hash]
# Parse cli arguments and construct a dictionary
# that will be passed to Package.do_install API # Parse cli arguments and construct a dictionary
kwargs = dict() # that will be passed to Package.do_install API
if args: kwargs = dict()
spack.cmd.install.update_kwargs_from_args(args, kwargs) if args:
spack.cmd.install.update_kwargs_from_args(args, kwargs)
self._install(spec, **kwargs)
self._install(spec, **kwargs)
if not spec.external:
# Link the resulting log file into logs dir if not spec.external:
build_log_link = os.path.join( # Link the resulting log file into logs dir
self.log_path, '%s-%s.log' % (spec.name, spec.dag_hash(7))) log_name = '%s-%s' % (spec.name, spec.dag_hash(7))
if os.path.lexists(build_log_link): build_log_link = os.path.join(self.log_path, log_name)
os.remove(build_log_link) if os.path.lexists(build_log_link):
os.symlink(spec.package.build_log_path, build_log_link) os.remove(build_log_link)
os.symlink(spec.package.build_log_path, build_log_link)
self.regenerate_views()
self.regenerate_views()
def all_specs_by_hash(self): def all_specs_by_hash(self):
"""Map of hashes to spec for all specs in this environment.""" """Map of hashes to spec for all specs in this environment."""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment