1
- use std:: sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ;
1
+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
2
2
use std:: {
3
3
collections:: { hash_map:: Entry , HashMap } ,
4
4
sync:: { Arc , Mutex } ,
@@ -21,7 +21,6 @@ struct ValueMap<T: Number<T>> {
21
21
buckets : Arc < [ Mutex < Option < HashMap < AttributeSet , T > > > ; 256 ] > ,
22
22
has_no_value_attribute_value : AtomicBool ,
23
23
no_attribute_value : T :: AtomicTracker ,
24
- total_count : AtomicUsize ,
25
24
}
26
25
27
26
impl < T : Number < T > > Default for ValueMap < T > {
@@ -42,7 +41,6 @@ impl<T: Number<T>> ValueMap<T> {
42
41
buckets : Arc :: new ( buckets) ,
43
42
has_no_value_attribute_value : AtomicBool :: new ( false ) ,
44
43
no_attribute_value : T :: new_atomic_tracker ( ) ,
45
- total_count : AtomicUsize :: new ( 0 ) ,
46
44
}
47
45
}
48
46
@@ -53,6 +51,17 @@ impl<T: Number<T>> ValueMap<T> {
53
51
// Use the 8 least significant bits directly, avoiding the modulus operation.
54
52
hasher. finish ( ) as u8
55
53
}
54
+
55
+ // Calculate the total length of data points across all buckets.
56
+ fn total_data_points_count ( & self ) -> usize {
57
+ self . buckets
58
+ . iter ( )
59
+ . map ( |bucket_mutex| {
60
+ let locked_bucket = bucket_mutex. lock ( ) . unwrap ( ) ;
61
+ locked_bucket. as_ref ( ) . map_or ( 0 , |bucket| bucket. len ( ) )
62
+ } )
63
+ . sum :: < usize > ( )
64
+ }
56
65
}
57
66
58
67
impl < T : Number < T > > ValueMap < T > {
@@ -80,7 +89,6 @@ impl<T: Number<T>> ValueMap<T> {
80
89
Entry :: Vacant ( vacant_entry) => {
81
90
if is_under_cardinality_limit ( size) {
82
91
vacant_entry. insert ( measurement) ;
83
- self . total_count . fetch_add ( 1 , Ordering :: SeqCst ) ;
84
92
} else {
85
93
// TBD - Update total_count ??
86
94
values
@@ -142,15 +150,11 @@ impl<T: Number<T>> Sum<T> {
142
150
s_data. is_monotonic = self . monotonic ;
143
151
s_data. data_points . clear ( ) ;
144
152
145
- let total_len = self . value_map . total_count . load ( Ordering :: SeqCst ) + 1 ;
153
+ let total_len: usize = self . value_map . total_data_points_count ( ) + 1 ;
146
154
if total_len > s_data. data_points . capacity ( ) {
147
- s_data
148
- . data_points
149
- . reserve_exact ( total_len - s_data. data_points . capacity ( ) ) ;
150
- } ;
151
- s_data
152
- . data_points
153
- . reserve_exact ( self . value_map . total_count . load ( Ordering :: SeqCst ) ) ;
155
+ let additional_space_needed = total_len - s_data. data_points . capacity ( ) ;
156
+ s_data. data_points . reserve_exact ( additional_space_needed) ;
157
+ }
154
158
155
159
let prev_start = self . start . lock ( ) . map ( |start| * start) . unwrap_or ( t) ;
156
160
if self
@@ -214,12 +218,11 @@ impl<T: Number<T>> Sum<T> {
214
218
s_data. is_monotonic = self . monotonic ;
215
219
s_data. data_points . clear ( ) ;
216
220
217
- let total_len = self . value_map . total_count . load ( Ordering :: SeqCst ) + 1 ;
221
+ let total_len: usize = self . value_map . total_data_points_count ( ) + 1 ;
218
222
if total_len > s_data. data_points . capacity ( ) {
219
- s_data
220
- . data_points
221
- . reserve_exact ( total_len - s_data. data_points . capacity ( ) ) ;
222
- } ;
223
+ let additional_space_needed = total_len - s_data. data_points . capacity ( ) ;
224
+ s_data. data_points . reserve_exact ( additional_space_needed) ;
225
+ }
223
226
224
227
let prev_start = self . start . lock ( ) . map ( |start| * start) . unwrap_or ( t) ;
225
228
@@ -306,12 +309,11 @@ impl<T: Number<T>> PrecomputedSum<T> {
306
309
s_data. temporality = Temporality :: Delta ;
307
310
s_data. is_monotonic = self . monotonic ;
308
311
309
- let total_len = self . value_map . total_count . load ( Ordering :: SeqCst ) + 1 ;
312
+ let total_len: usize = self . value_map . total_data_points_count ( ) + 1 ;
310
313
if total_len > s_data. data_points . capacity ( ) {
311
- s_data
312
- . data_points
313
- . reserve_exact ( total_len - s_data. data_points . capacity ( ) ) ;
314
- } ;
314
+ let additional_space_needed = total_len - s_data. data_points . capacity ( ) ;
315
+ s_data. data_points . reserve_exact ( additional_space_needed) ;
316
+ }
315
317
316
318
let mut new_reported = HashMap :: with_capacity ( total_len) ;
317
319
let mut reported = match self . reported . lock ( ) {
@@ -387,12 +389,12 @@ impl<T: Number<T>> PrecomputedSum<T> {
387
389
s_data. data_points . clear ( ) ;
388
390
s_data. temporality = Temporality :: Cumulative ;
389
391
s_data. is_monotonic = self . monotonic ;
390
- let total_len = self . value_map . total_count . load ( Ordering :: SeqCst ) + 1 ;
392
+
393
+ let total_len: usize = self . value_map . total_data_points_count ( ) + 1 ;
391
394
if total_len > s_data. data_points . capacity ( ) {
392
- s_data
393
- . data_points
394
- . reserve_exact ( total_len - s_data. data_points . capacity ( ) ) ;
395
- } ;
395
+ let additional_space_needed = total_len - s_data. data_points . capacity ( ) ;
396
+ s_data. data_points . reserve_exact ( additional_space_needed) ;
397
+ }
396
398
397
399
let mut new_reported = HashMap :: with_capacity ( total_len) ;
398
400
let mut reported = match self . reported . lock ( ) {
0 commit comments