11use std:: collections:: HashMap ;
22
3+ use dashmap:: DashMap ;
34use opentelemetry_proto:: tonic:: metrics:: v1:: Metric ;
45
56use crate :: {
@@ -15,7 +16,7 @@ pub(crate) struct TsdbDeltaBuilder<'a> {
1516 pub ( crate ) bucket : TimeBucket ,
1617 pub ( crate ) forward_index : ForwardIndex ,
1718 pub ( crate ) inverted_index : InvertedIndex ,
18- pub ( crate ) series_dict : & ' a HashMap < SeriesFingerprint , SeriesId > ,
19+ pub ( crate ) series_dict : & ' a DashMap < SeriesFingerprint , SeriesId > ,
1920 pub ( crate ) series_dict_delta : HashMap < SeriesFingerprint , SeriesId > ,
2021 pub ( crate ) samples : HashMap < SeriesId , Vec < Sample > > ,
2122 pub ( crate ) next_series_id : u32 ,
@@ -24,7 +25,8 @@ pub(crate) struct TsdbDeltaBuilder<'a> {
2425impl < ' a > TsdbDeltaBuilder < ' a > {
2526 pub ( crate ) fn new (
2627 bucket : TimeBucket ,
27- series_dict : & ' a HashMap < SeriesFingerprint , SeriesId > ,
28+ series_dict : & ' a DashMap < SeriesFingerprint , SeriesId > ,
29+ next_series_id : u32 ,
2830 ) -> Self {
2931 Self {
3032 bucket,
@@ -33,7 +35,7 @@ impl<'a> TsdbDeltaBuilder<'a> {
3335 series_dict,
3436 series_dict_delta : HashMap :: new ( ) ,
3537 samples : HashMap :: new ( ) ,
36- next_series_id : 0 ,
38+ next_series_id,
3739 }
3840 }
3941
@@ -73,8 +75,8 @@ impl<'a> TsdbDeltaBuilder<'a> {
7375 let series_id = self
7476 . series_dict
7577 . get ( & fingerprint)
76- . or_else ( || self . series_dict_delta . get ( & fingerprint ) )
77- . copied ( )
78+ . map ( |r| * r . value ( ) )
79+ . or_else ( || self . series_dict_delta . get ( & fingerprint ) . copied ( ) )
7880 . unwrap_or_else ( || {
7981 let series_id = self . next_series_id ;
8082 self . next_series_id = series_id + 1 ;
@@ -128,6 +130,7 @@ pub(crate) struct TsdbDelta {
128130mod tests {
129131 use super :: * ;
130132 use crate :: model:: { Attribute , MetricType , Temporality } ;
133+ use dashmap:: DashMap ;
131134
132135 fn create_test_bucket ( ) -> TimeBucket {
133136 TimeBucket :: hour ( 1000 )
@@ -157,8 +160,8 @@ mod tests {
157160 fn should_create_new_series_when_ingesting_first_sample ( ) {
158161 // given
159162 let bucket = create_test_bucket ( ) ;
160- let series_dict = HashMap :: new ( ) ;
161- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
163+ let series_dict = DashMap :: new ( ) ;
164+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
162165 let attributes = create_test_attributes ( ) ;
163166 let sample = create_test_sample ( ) ;
164167 let metric_unit = Some ( "bytes" . to_string ( ) ) ;
@@ -205,8 +208,8 @@ mod tests {
205208 fn should_reuse_series_id_for_samples_with_same_attributes ( ) {
206209 // given
207210 let bucket = create_test_bucket ( ) ;
208- let series_dict = HashMap :: new ( ) ;
209- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
211+ let series_dict = DashMap :: new ( ) ;
212+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
210213 let attributes = create_test_attributes ( ) ;
211214 let sample1 = Sample {
212215 timestamp : 1000 ,
@@ -248,8 +251,8 @@ mod tests {
248251 fn should_create_different_series_id_for_different_attributes ( ) {
249252 // given
250253 let bucket = create_test_bucket ( ) ;
251- let series_dict = HashMap :: new ( ) ;
252- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
254+ let series_dict = DashMap :: new ( ) ;
255+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
253256 let attributes1 = vec ! [ Attribute {
254257 key: "service" . to_string( ) ,
255258 value: "api" . to_string( ) ,
@@ -286,13 +289,13 @@ mod tests {
286289 fn should_reuse_series_id_from_existing_series_dict ( ) {
287290 // given
288291 let bucket = create_test_bucket ( ) ;
289- let mut series_dict = HashMap :: new ( ) ;
292+ let series_dict = DashMap :: new ( ) ;
290293 let mut attributes = create_test_attributes ( ) ;
291294 // Sort attributes to match what ingest_sample does
292295 attributes. sort_by ( |a, b| a. key . cmp ( & b. key ) ) ;
293296 let fingerprint = attributes. fingerprint ( ) ;
294297 series_dict. insert ( fingerprint, 42 ) ; // Existing series_id
295- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
298+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
296299 let metric_type = MetricType :: Gauge ;
297300
298301 // when
@@ -314,8 +317,8 @@ mod tests {
314317 fn should_reuse_series_id_from_delta_dict_when_ingesting_again ( ) {
315318 // given
316319 let bucket = create_test_bucket ( ) ;
317- let series_dict = HashMap :: new ( ) ;
318- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
320+ let series_dict = DashMap :: new ( ) ;
321+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
319322 let attributes = create_test_attributes ( ) ;
320323 let metric_type = MetricType :: Gauge ;
321324
@@ -345,8 +348,8 @@ mod tests {
345348 fn should_sort_attributes_before_fingerprinting ( ) {
346349 // given
347350 let bucket = create_test_bucket ( ) ;
348- let series_dict = HashMap :: new ( ) ;
349- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
351+ let series_dict = DashMap :: new ( ) ;
352+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
350353 let attributes1 = vec ! [
351354 Attribute {
352355 key: "z_key" . to_string( ) ,
@@ -393,8 +396,8 @@ mod tests {
393396 fn should_store_metric_unit_and_type_in_forward_index ( ) {
394397 // given
395398 let bucket = create_test_bucket ( ) ;
396- let series_dict = HashMap :: new ( ) ;
397- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
399+ let series_dict = DashMap :: new ( ) ;
400+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
398401 let attributes = create_test_attributes ( ) ;
399402 let metric_unit = Some ( "requests_per_second" . to_string ( ) ) ;
400403 let metric_type = MetricType :: Sum {
@@ -429,8 +432,8 @@ mod tests {
429432 fn should_index_all_attributes_in_inverted_index ( ) {
430433 // given
431434 let bucket = create_test_bucket ( ) ;
432- let series_dict = HashMap :: new ( ) ;
433- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
435+ let series_dict = DashMap :: new ( ) ;
436+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
434437 let attributes = vec ! [
435438 Attribute {
436439 key: "service" . to_string( ) ,
@@ -468,8 +471,8 @@ mod tests {
468471 fn should_handle_empty_attributes_list ( ) {
469472 // given
470473 let bucket = create_test_bucket ( ) ;
471- let series_dict = HashMap :: new ( ) ;
472- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
474+ let series_dict = DashMap :: new ( ) ;
475+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
473476 let attributes = Vec :: < Attribute > :: new ( ) ;
474477 let metric_type = MetricType :: Gauge ;
475478
@@ -494,8 +497,8 @@ mod tests {
494497 fn should_handle_none_metric_unit ( ) {
495498 // given
496499 let bucket = create_test_bucket ( ) ;
497- let series_dict = HashMap :: new ( ) ;
498- let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict) ;
500+ let series_dict = DashMap :: new ( ) ;
501+ let mut builder = TsdbDeltaBuilder :: new ( bucket, & series_dict, 0 ) ;
499502 let attributes = create_test_attributes ( ) ;
500503 let metric_type = MetricType :: Gauge ;
501504
0 commit comments