Fix #1632 - Occasional Segfault with LongCounter instrument #1638
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.
Fixes #1632
Changes
The problem occurs when metric collection is happening while measurements are getting recorded in different threads ( PeriodicExportingMetricReader creates separate thread for collection)
Thread1:
Instrument::Record()
->SyncMetricStorage::Record()
->AttributeHashMap::GetOrSetDefault()
->mutex_lock
->map::insert()
Thread2:
SyncMetricStorage::Collect ()
->std::move(AttributeHashMap)
-> ...While thread1 is recording in attribute-hashmap, thread2 can sometime clear the attribute-hashmap (by move it to different hashmap), which cause thread1 to try recording in invalid memory.
The solution is to remove locks from attribute-hashmap, and add it to SyncMetricStorage/AsyncMetricStorage whereever it is reading/updating/moving attribute-hashmap
i.e.,
Thread1:
Instrument::Record()
->SyncMetricStorage::Record ()
->mutex_lock_
->AttributeHashMap::GetOrSetDefault()
->map::insert()
Thread2:
SyncMetricStorage::Collect ()
->mutex_lock
->std::move(AttributeHashMap)
-> ...For significant contributions please make sure you have completed the following items:
CHANGELOG.md
updated for non-trivial changes