Avoid modifying source objects when merging cache results. #4089
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.
As #4081 demonstrates, if there are key collisions during result merging, it's possible for source objects that were previously merged by reference into the
target
object (finalResult.result
) to be modified destructively by later merges, which in some cases can lead to cycles in the results returned by the cache.This version of the
merge
function uses a copy-on-first-write strategy to ensure we never modifytarget
objects that might once have beensource
objects. The code could have been considerably simpler if I didn't try to trackpastCopies
, but performance and memory usage are very important for this code, which is why I went to the trouble of limiting the number of shallow copies made during a singlemerge
.