Make sure MetricsHandler doesn't crash upon multiple concurrent writes #359
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.
With heavy traffic, concurrent usage of TrackLoginState() and similar
could result in
fatal error: concurrent map read and map write
,crashing the whole process.
The effectiveness of the fix can be observed with this test, which I'm not submitting because of it being an ugly hack:
This explodes with the aforementioned message before the patch, survives and passes after.
I had another attempt at this using channels for synchronizing all these writes, but it was a PITA to get right (processing them only after Start() while closing them after Stop() while avoiding writing to closed channels...) that I figured I'd rather keep it simple, especially since the operations themselves are so trivial that the mutex is unlikely to cause any noticable issues anyway.