[release/8.0-staging] Use a sorted module order for metadata generation #96168
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.
Backport of #96007 to release/8.0-staging
/cc @MichalStrehovsky
Customer Impact
This fixes similar issue to #96167 so copying motivation from there:
Since native AOT compiler is multithreaded but we need deterministic outputs, we achieve the determinism by sorting the output before writing it to disk. The sorting ensures the same input produces the same output. However to support some first party patching scenarios, we would ideally also ensure "mostly the same input" produces "mostly the same output".
However, we didn't sort the assemblies before generating reflection metadata. This is a latent issue when it comes to reproducible builds - sorting is not needed if the set of compiled methods/types is identical. It is needed if the set varies.
Testing
Manual testing using the delta patching tool saw ~10x decrease in patch size. (This was tested together with #96167 although the impact of this one is a bit smaller.)
Risk
Low, we already use SortedSet for many other things.
IMPORTANT: If this backport is for a servicing release, please verify that:
The PR target branch is
release/X.0-staging, notrelease/X.0.If the change touches code that ships in a NuGet package, you have added the necessary package authoring and gotten it explicitly reviewed.