@@ -72,14 +72,10 @@ where
7272{
7373 fn new ( config : A :: InitConfig ) -> Self {
7474 ValueMap {
75- trackers : RwLock :: new ( HashMap :: with_capacity (
76- 1 + STREAM_CARDINALITY_LIMIT as usize ,
77- ) ) ,
75+ trackers : RwLock :: new ( HashMap :: with_capacity ( 1 + STREAM_CARDINALITY_LIMIT ) ) ,
7876 // TODO: For cumulative, this is not required, so avoid this
7977 // pre-allocation.
80- trackers_for_collect : RwLock :: new ( HashMap :: with_capacity (
81- 1 + STREAM_CARDINALITY_LIMIT as usize ,
82- ) ) ,
78+ trackers_for_collect : RwLock :: new ( HashMap :: with_capacity ( 1 + STREAM_CARDINALITY_LIMIT ) ) ,
8379 has_no_attribute_value : AtomicBool :: new ( false ) ,
8480 no_attribute_tracker : A :: create ( & config) ,
8581 count : AtomicUsize :: new ( 0 ) ,
@@ -182,28 +178,23 @@ where
182178 ) ) ;
183179 }
184180
185- let mut trackers = if let Ok ( mut trackers_guard) = self . trackers . write ( ) {
186- if let Ok ( mut trackers_for_collect_guard) = self . trackers_for_collect . write ( ) {
187- swap (
188- trackers_guard. deref_mut ( ) ,
189- trackers_for_collect_guard. deref_mut ( ) ,
190- ) ;
181+ if let Ok ( mut trackers_collect) = self . trackers_for_collect . write ( ) {
182+ if let Ok ( mut trackers_current) = self . trackers . write ( ) {
183+ swap ( trackers_collect. deref_mut ( ) , trackers_current. deref_mut ( ) ) ;
191184 self . count . store ( 0 , Ordering :: SeqCst ) ;
192- trackers_for_collect_guard
193185 } else {
194- otel_warn ! ( name: "MeterProvider.InternalError" , message = "Metric collection failed. Report this issue in OpenTelemetry repo." , details ="ValueMap trackers for collect lock poisoned" ) ;
186+ otel_warn ! ( name: "MeterProvider.InternalError" , message = "Metric collection failed. Report this issue in OpenTelemetry repo." , details ="ValueMap trackers lock poisoned" ) ;
195187 return ;
196188 }
197- } else {
198- otel_warn ! ( name: "MeterProvider.InternalError" , message = "Metric collection failed. Report this issue in OpenTelemetry repo." , details ="ValueMap trackers lock poisoned" ) ;
199- return ;
200- } ;
201189
202- let mut seen = HashSet :: new ( ) ;
203- for ( attrs, tracker) in trackers. drain ( ) {
204- if seen. insert ( Arc :: as_ptr ( & tracker) ) {
205- dest. push ( map_fn ( attrs, tracker. clone_and_reset ( & self . config ) ) ) ;
190+ let mut seen = HashSet :: new ( ) ;
191+ for ( attrs, tracker) in trackers_collect. drain ( ) {
192+ if seen. insert ( Arc :: as_ptr ( & tracker) ) {
193+ dest. push ( map_fn ( attrs, tracker. clone_and_reset ( & self . config ) ) ) ;
194+ }
206195 }
196+ } else {
197+ otel_warn ! ( name: "MeterProvider.InternalError" , message = "Metric collection failed. Report this issue in OpenTelemetry repo." , details ="ValueMap trackers for collect lock poisoned" ) ;
207198 }
208199 }
209200}
0 commit comments