Skip to content

Commit 3616dc9

Browse files
authored
fix: split lock in TracerProvider (#866)
* fix: split lock in TracerProvider * silence the cop
1 parent 037a07b commit 3616dc9

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

sdk/lib/opentelemetry/sdk/trace/tracer_provider.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def initialize(sampler: sampler_from_environment(Samplers.parent_based(root: Sam
3333
span_limits: SpanLimits::DEFAULT)
3434
@mutex = Mutex.new
3535
@registry = {}
36+
@registry_mutex = Mutex.new
3637
@span_processors = []
3738
@span_limits = span_limits
3839
@sampler = sampler
@@ -51,7 +52,7 @@ def tracer(name = nil, version = nil)
5152
name ||= ''
5253
version ||= ''
5354
OpenTelemetry.logger.warn 'calling TracerProvider#tracer without providing a tracer name.' if name.empty?
54-
@mutex.synchronize { @registry[Key.new(name, version)] ||= Tracer.new(name, version, self) }
55+
@registry_mutex.synchronize { @registry[Key.new(name, version)] ||= Tracer.new(name, version, self) }
5556
end
5657

5758
# Attempts to stop all the activity for this {TracerProvider}. Calls

sdk/test/opentelemetry/sdk/trace/tracer_provider_test.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@
8484
mock_span_processor.verify
8585
mock_span_processor2.verify
8686
end
87+
88+
it 'does not deadlock if span processor is traced' do
89+
span_processor = OpenTelemetry::SDK::Trace::SpanProcessor.new
90+
tracer_provider.add_span_processor(span_processor)
91+
span_processor.stub(:shutdown, ->(timeout: nil) { tracer_provider.tracer.in_span('shutdown') {} }) do # rubocop:disable Lint/UnusedBlockArgument
92+
tracer_provider.shutdown
93+
end
94+
pass 'no deadlock'
95+
end
8796
end
8897

8998
describe '#force_flush' do

0 commit comments

Comments
 (0)