@@ -38,7 +38,7 @@ pub struct SdkMeterProvider {
38
38
struct SdkMeterProviderInner {
39
39
pipes : Arc < Pipelines > ,
40
40
meters : Mutex < HashMap < InstrumentationScope , Arc < SdkMeter > > > ,
41
- is_shutdown : AtomicBool ,
41
+ shutdown_invoked : AtomicBool ,
42
42
}
43
43
44
44
impl Default for SdkMeterProvider {
@@ -119,20 +119,29 @@ impl SdkMeterProvider {
119
119
120
120
impl SdkMeterProviderInner {
121
121
fn force_flush ( & self ) -> MetricResult < ( ) > {
122
- self . pipes . force_flush ( )
122
+ if self
123
+ . shutdown_invoked
124
+ . load ( std:: sync:: atomic:: Ordering :: Relaxed )
125
+ {
126
+ Err ( MetricError :: Other (
127
+ "Cannot perform flush as MeterProvider shutdown already invoked." . into ( ) ,
128
+ ) )
129
+ } else {
130
+ self . pipes . force_flush ( )
131
+ }
123
132
}
124
133
125
134
fn shutdown ( & self ) -> MetricResult < ( ) > {
126
135
if self
127
- . is_shutdown
128
- . compare_exchange ( false , true , Ordering :: SeqCst , Ordering :: SeqCst )
129
- . is_ok ( )
136
+ . shutdown_invoked
137
+ . swap ( true , std:: sync:: atomic:: Ordering :: SeqCst )
130
138
{
131
- self . pipes . shutdown ( )
132
- } else {
139
+ // If the previous value was true, shutdown was already invoked.
133
140
Err ( MetricError :: Other (
134
- "metrics provider already shut down " . into ( ) ,
141
+ "MeterProvider shutdown already invoked. " . into ( ) ,
135
142
) )
143
+ } else {
144
+ self . pipes . shutdown ( )
136
145
}
137
146
}
138
147
}
@@ -141,7 +150,7 @@ impl Drop for SdkMeterProviderInner {
141
150
fn drop ( & mut self ) {
142
151
// If user has already shutdown the provider manually by calling
143
152
// shutdown(), then we don't need to call shutdown again.
144
- if self . is_shutdown . load ( Ordering :: Relaxed ) {
153
+ if self . shutdown_invoked . load ( Ordering :: Relaxed ) {
145
154
otel_debug ! (
146
155
name: "MeterProvider.Drop.AlreadyShutdown" ,
147
156
message = "MeterProvider was already shut down; drop will not attempt shutdown again."
@@ -173,7 +182,7 @@ impl MeterProvider for SdkMeterProvider {
173
182
}
174
183
175
184
fn meter_with_scope ( & self , scope : InstrumentationScope ) -> Meter {
176
- if self . inner . is_shutdown . load ( Ordering :: Relaxed ) {
185
+ if self . inner . shutdown_invoked . load ( Ordering :: Relaxed ) {
177
186
otel_debug ! (
178
187
name: "MeterProvider.NoOpMeterReturned" ,
179
188
meter_name = scope. name( ) ,
@@ -270,7 +279,7 @@ impl MeterProviderBuilder {
270
279
self . views ,
271
280
) ) ,
272
281
meters : Default :: default ( ) ,
273
- is_shutdown : AtomicBool :: new ( false ) ,
282
+ shutdown_invoked : AtomicBool :: new ( false ) ,
274
283
} ) ,
275
284
} ;
276
285
0 commit comments