Fixing GeoIpDownloaderStatsAction$NodeResponse serialization by defensively copying inputs #96777
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.
We don't currently make a defensive copy of the inputs to the GeoIpDownloaderStatsAction$NodeResponse constructor. Some of those inputs are subject to change when a geoip database is reloaded. That can cause serialization to break (because the serialization code assumes that the contents of the Sets are not changing during serialization. This PR makes an immutable copy of the Sets in NodeResponse to prevent this.
Before this fix, we would occasionally see failures like this:
I was able to force this to reproduce reliably by artificially putting a 2-second sleep into the serialization code (StreamOutput.writeCollection) between when the size of the collection is read and when the values are written. With this fix I have been unable to reproduce it.
Closes #96438