@@ -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,29 @@ impl SdkMeterProvider {
119119
120120impl SdkMeterProviderInner {
121121 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+ }
123132 }
124133
125134 fn shutdown ( & self ) -> MetricResult < ( ) > {
126135 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 )
130138 {
131- self . pipes . shutdown ( )
132- } else {
139+ // If the previous value was true, shutdown was already invoked.
133140 Err ( MetricError :: Other (
134- "metrics provider already shut down " . into ( ) ,
141+ "MeterProvider shutdown already invoked. " . into ( ) ,
135142 ) )
143+ } else {
144+ self . pipes . shutdown ( )
136145 }
137146 }
138147}
@@ -141,7 +150,7 @@ impl Drop for SdkMeterProviderInner {
141150 fn drop ( & mut self ) {
142151 // If user has already shutdown the provider manually by calling
143152 // 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 ) {
145154 otel_debug ! (
146155 name: "MeterProvider.Drop.AlreadyShutdown" ,
147156 message = "MeterProvider was already shut down; drop will not attempt shutdown again."
@@ -173,7 +182,7 @@ impl MeterProvider for SdkMeterProvider {
173182 }
174183
175184 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 ) {
177186 otel_debug ! (
178187 name: "MeterProvider.NoOpMeterReturned" ,
179188 meter_name = scope. name( ) ,
@@ -270,7 +279,7 @@ impl MeterProviderBuilder {
270279 self . views ,
271280 ) ) ,
272281 meters : Default :: default ( ) ,
273- is_shutdown : AtomicBool :: new ( false ) ,
282+ shutdown_invoked : AtomicBool :: new ( false ) ,
274283 } ) ,
275284 } ;
276285
0 commit comments