Detect colliding keys in Active Job Hash serialization #45676
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.
Summary
ActiveJob serializes
Symbol
Hash
keys by stringifying them, and storing an array of keys to be symbolized on deserialization as_aj_symbol_keys
. This means that if aHash
has bothSymbol
andString
keys with the same contents, they will collide.Specifically, the resulting hash ends up containing only a pair consisting of:
This PR adds a check for this and logs a deprecation warning. It also introduces a setting to
raise
instead of logging the warning, with the intention of making this behavior the default in Rails 7.2/8.0.Other Information
I have left a number of placeholders for the time being, because I wanted to get initial review and confirm we want to do this, before investing the time to write the docs, deprecation message, changelog, etc.
cc. @Mangara, who mentioned this in Slack