@@ -38,7 +38,7 @@ pub struct SdkMeterProvider {
3838struct SdkMeterProviderInner {
3939 pipes : Arc < Pipelines > ,
4040 meters : Mutex < HashMap < InstrumentationScope , Arc < SdkMeter > > > ,
41- is_shutdown : AtomicBool ,
41+ shutdown_invoked : AtomicBool ,
4242}
4343
4444impl Default for SdkMeterProvider {
@@ -119,20 +119,26 @@ impl SdkMeterProvider {
119119
120120impl SdkMeterProviderInner {
121121 fn force_flush ( & self ) -> MetricResult < ( ) > {
122- self . pipes . force_flush ( )
122+ if self . shutdown_invoked . load ( std:: sync:: atomic:: Ordering :: Relaxed ) {
123+ Err ( MetricError :: Other (
124+ "Cannot perform flush as MeterProvider shutdown already invoked." . into ( ) ,
125+ ) )
126+ } else {
127+ self . pipes . force_flush ( )
128+ }
123129 }
124130
125131 fn shutdown ( & self ) -> MetricResult < ( ) > {
126132 if self
127- . is_shutdown
128- . compare_exchange ( false , true , Ordering :: SeqCst , Ordering :: SeqCst )
129- . is_ok ( )
133+ . shutdown_invoked
134+ . swap ( true , std:: sync:: atomic:: Ordering :: SeqCst )
130135 {
131- self . pipes . shutdown ( )
132- } else {
136+ // If the previous value was true, shutdown was already invoked.
133137 Err ( MetricError :: Other (
134- "metrics provider already shut down " . into ( ) ,
138+ "MeterProvider shutdown already invoked. " . into ( ) ,
135139 ) )
140+ } else {
141+ self . pipes . shutdown ( )
136142 }
137143 }
138144}
@@ -141,7 +147,7 @@ impl Drop for SdkMeterProviderInner {
141147 fn drop ( & mut self ) {
142148 // If user has already shutdown the provider manually by calling
143149 // shutdown(), then we don't need to call shutdown again.
144- if self . is_shutdown . load ( Ordering :: Relaxed ) {
150+ if self . shutdown_invoked . load ( Ordering :: Relaxed ) {
145151 otel_debug ! (
146152 name: "MeterProvider.Drop.AlreadyShutdown" ,
147153 message = "MeterProvider was already shut down; drop will not attempt shutdown again."
@@ -173,7 +179,7 @@ impl MeterProvider for SdkMeterProvider {
173179 }
174180
175181 fn meter_with_scope ( & self , scope : InstrumentationScope ) -> Meter {
176- if self . inner . is_shutdown . load ( Ordering :: Relaxed ) {
182+ if self . inner . shutdown_invoked . load ( Ordering :: Relaxed ) {
177183 otel_debug ! (
178184 name: "MeterProvider.NoOpMeterReturned" ,
179185 meter_name = scope. name( ) ,
@@ -270,7 +276,7 @@ impl MeterProviderBuilder {
270276 self . views ,
271277 ) ) ,
272278 meters : Default :: default ( ) ,
273- is_shutdown : AtomicBool :: new ( false ) ,
279+ shutdown_invoked : AtomicBool :: new ( false ) ,
274280 } ) ,
275281 } ;
276282
0 commit comments