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
This commit is contained in:
parent
d87ededddc
commit
be6d7db2a8
@ -992,19 +992,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)
|
||||||
@ -1177,26 +1180,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
|
# Parse cli arguments and construct a dictionary
|
||||||
# that will be passed to Package.do_install API
|
# that will be passed to Package.do_install API
|
||||||
kwargs = dict()
|
kwargs = dict()
|
||||||
if args:
|
if args:
|
||||||
spack.cmd.install.update_kwargs_from_args(args, kwargs)
|
spack.cmd.install.update_kwargs_from_args(args, kwargs)
|
||||||
|
|
||||||
self._install(spec, **kwargs)
|
self._install(spec, **kwargs)
|
||||||
|
|
||||||
if not spec.external:
|
if not spec.external:
|
||||||
# Link the resulting log file into logs dir
|
# Link the resulting log file into logs dir
|
||||||
build_log_link = os.path.join(
|
log_name = '%s-%s' % (spec.name, spec.dag_hash(7))
|
||||||
self.log_path, '%s-%s.log' % (spec.name, spec.dag_hash(7)))
|
build_log_link = os.path.join(self.log_path, log_name)
|
||||||
if os.path.lexists(build_log_link):
|
if os.path.lexists(build_log_link):
|
||||||
os.remove(build_log_link)
|
os.remove(build_log_link)
|
||||||
os.symlink(spec.package.build_log_path, 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."""
|
||||||
|
Loading…
Reference in New Issue
Block a user