Lock all accesses to entities. #250
Merged
+452
−244
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.
Issue #, if available: #108
Description of changes:
Almost none of the entity accesses are currently safe since there are many mutations of non-volatile fields. While making fields volatile is one way to help, modern CPUs have fast enough performance for non-contended locks (just atomic CAS) that it's common to just use locks (Golang makes it very hard to use volatile for this reason). This is the implementation OTel uses
https://github.com/open-telemetry/opentelemetry-java/blob/master/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java
OTel doesn't have setters for every single thing so doesn't need as much locking, but as we don't expect much contention here it should be fine.
I haven't quite reasoned through whether this fixes the subsegment issues, but it's an important change regardless.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.