performance: don't recompute hashes when regenerating environments
`ViewDescriptor.regenerate()` was copying specs and stripping build dependencies, which clears `_hash` and other cached fields on concrete specs, which causes a bunch of YAML hashes to be recomputed. - [x] Preserve the `_hash` and `_normal` fields on stripped specs, as these will be unchanged.
This commit is contained in:
parent
f013687397
commit
e3939b0c72
@ -511,10 +511,15 @@ def regenerate(self, all_specs, roots):
|
|||||||
specs = all_specs if self.link == 'all' else roots
|
specs = all_specs if self.link == 'all' else roots
|
||||||
for spec in specs:
|
for spec in specs:
|
||||||
# The view does not store build deps, so if we want it to
|
# The view does not store build deps, so if we want it to
|
||||||
# recognize environment specs (which do store build deps), then
|
# recognize environment specs (which do store build deps),
|
||||||
# they need to be stripped
|
# then they need to be stripped.
|
||||||
if spec.concrete: # Do not link unconcretized roots
|
if spec.concrete: # Do not link unconcretized roots
|
||||||
specs_for_view.append(spec.copy(deps=('link', 'run')))
|
# We preserve _hash _normal to avoid recomputing DAG
|
||||||
|
# hashes (DAG hashes don't consider build deps)
|
||||||
|
spec_copy = spec.copy(deps=('link', 'run'))
|
||||||
|
spec_copy._hash = spec._hash
|
||||||
|
spec_copy._normal = spec._normal
|
||||||
|
specs_for_view.append(spec_copy)
|
||||||
|
|
||||||
# regeneration queries the database quite a bit; this read
|
# regeneration queries the database quite a bit; this read
|
||||||
# transaction ensures that we don't repeatedly lock/unlock.
|
# transaction ensures that we don't repeatedly lock/unlock.
|
||||||
|
@ -2999,7 +2999,7 @@ def _dup(self, other, deps=True, cleardeps=True, caches=None):
|
|||||||
before possibly copying the dependencies of ``other`` onto
|
before possibly copying the dependencies of ``other`` onto
|
||||||
``self``
|
``self``
|
||||||
caches (bool or None): preserve cached fields such as
|
caches (bool or None): preserve cached fields such as
|
||||||
``_normal``, ``_concrete``, and ``_cmp_key_cache``. By
|
``_normal``, ``_hash``, and ``_cmp_key_cache``. By
|
||||||
default this is ``False`` if DAG structure would be
|
default this is ``False`` if DAG structure would be
|
||||||
changed by the copy, ``True`` if it's an exact copy.
|
changed by the copy, ``True`` if it's an exact copy.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user