[bugfix] Prevents the recursive redefinition of root chains #16857
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This fix prevents an edge case where recursive call to
writableChains
causes the root
_chains
ChainNode on a meta to be overwritten,resulting in a chains node that does not match up with the
watching
state of the meta.
This can occur when:
finalizing chains.
dependencies to setup their chains.
In the case observed, it was only triggered because there were some
number of intermediate aliases between the
computed
and theobserver
. Aliases are not volatile, but they also don't use thecomputed cache for values so they cannot rely on
getCachedValueFor
when setting up chains. This results in eager fetching of computed
values, which leads to the nested recursive call.
This PR solves the problem by ensuring that the root chain node is set
on the meta before we attempt to add any values to it (e.g. with
copy
). The copy method has been renamed tocopyTo
to indicate thatit is not actually creating or returning a copy (open to suggestions
for a better name).