@@ -54,6 +54,8 @@ pub struct RawMassaDB<
54
54
pub change_id_deserializer : ChangeIDDeserializer ,
55
55
/// The current RocksDB batch of the database, in a Mutex to share it
56
56
pub current_batch : Arc < Mutex < WriteBatch > > ,
57
+ /// If metrics are enabled, we keep track of the size of the changes associated to each change_id
58
+ pub change_history_sizes : BTreeMap < ChangeID , ( usize , usize ) > ,
57
59
}
58
60
59
61
impl < ChangeID , ChangeIDSerializer , ChangeIDDeserializer > std:: fmt:: Debug
@@ -389,15 +391,51 @@ where
389
391
}
390
392
}
391
393
392
- // in versioning_changes, we have the data that we do not want to include in hash
393
- // e.g everything that is not in 'Active' state (so hashes remain compatibles)
394
- for ( key, value) in versioning_changes. iter ( ) {
395
- if let Some ( value) = value {
396
- self . current_batch
397
- . lock ( )
398
- . put_cf ( handle_versioning, key, value) ;
399
- } else {
400
- self . current_batch . lock ( ) . delete_cf ( handle_versioning, key) ;
394
+ // If metrics are enabled, we keep track of the size of the changes (for state changes, and then for versioning changes)
395
+ if self . config . enable_metrics {
396
+ let changes_size;
397
+ let changes_versioning_size;
398
+ {
399
+ let mut current_batch_guard = self . current_batch . lock ( ) ;
400
+ changes_size = current_batch_guard. size_in_bytes ( ) ;
401
+
402
+ // in versioning_changes, we have the data that we do not want to include in hash
403
+ // e.g everything that is not in 'Active' state (so hashes remain compatibles)
404
+ for ( key, value) in versioning_changes. iter ( ) {
405
+ if let Some ( value) = value {
406
+ current_batch_guard. put_cf ( handle_versioning, key, value) ;
407
+ } else {
408
+ current_batch_guard. delete_cf ( handle_versioning, key) ;
409
+ }
410
+ }
411
+
412
+ changes_versioning_size = current_batch_guard
413
+ . size_in_bytes ( )
414
+ . saturating_sub ( changes_size) ;
415
+ }
416
+
417
+ match self
418
+ . change_history_sizes
419
+ . entry ( self . get_change_id ( ) . expect ( CHANGE_ID_DESER_ERROR ) )
420
+ {
421
+ std:: collections:: btree_map:: Entry :: Vacant ( entry) => {
422
+ entry. insert ( ( changes_size, changes_versioning_size) ) ;
423
+ }
424
+ std:: collections:: btree_map:: Entry :: Occupied ( mut entry) => {
425
+ entry. get_mut ( ) . 0 += changes_size;
426
+ entry. get_mut ( ) . 1 += changes_versioning_size;
427
+ }
428
+ }
429
+ } else {
430
+ let mut current_batch_guard = self . current_batch . lock ( ) ;
431
+ // in versioning_changes, we have the data that we do not want to include in hash
432
+ // e.g everything that is not in 'Active' state (so hashes remain compatibles)
433
+ for ( key, value) in versioning_changes. iter ( ) {
434
+ if let Some ( value) = value {
435
+ current_batch_guard. put_cf ( handle_versioning, key, value) ;
436
+ } else {
437
+ current_batch_guard. delete_cf ( handle_versioning, key) ;
438
+ }
401
439
}
402
440
}
403
441
@@ -447,10 +485,12 @@ where
447
485
if reset_history {
448
486
self . change_history . clear ( ) ;
449
487
self . change_history_versioning . clear ( ) ;
488
+ self . change_history_sizes . clear ( ) ;
450
489
}
451
490
452
491
while self . change_history . len ( ) > self . config . max_history_length {
453
492
self . change_history . pop_first ( ) ;
493
+ self . change_history_sizes . pop_first ( ) ;
454
494
}
455
495
456
496
while self . change_history_versioning . len ( ) > self . config . max_history_length {
@@ -614,6 +654,7 @@ impl RawMassaDB<Slot, SlotSerializer, SlotDeserializer> {
614
654
config,
615
655
change_history : BTreeMap :: new ( ) ,
616
656
change_history_versioning : BTreeMap :: new ( ) ,
657
+ change_history_sizes : BTreeMap :: new ( ) ,
617
658
change_id_serializer : SlotSerializer :: new ( ) ,
618
659
change_id_deserializer,
619
660
current_batch,
@@ -851,6 +892,15 @@ impl MassaDBController for RawMassaDB<Slot, SlotSerializer, SlotDeserializer> {
851
892
self . get_versioning_batch_to_stream ( last_versioning_step, last_change_id)
852
893
}
853
894
895
+ fn get_change_history_sizes ( & self ) -> ( usize , usize ) {
896
+ self . change_history_sizes . values ( ) . fold (
897
+ ( 0 , 0 ) ,
898
+ |( acc_state, acc_version) , & ( state, version) | {
899
+ ( acc_state + state, acc_version + version)
900
+ } ,
901
+ )
902
+ }
903
+
854
904
#[ cfg( feature = "test-exports" ) ]
855
905
fn get_entire_database ( & self ) -> Vec < BTreeMap < Vec < u8 > , Vec < u8 > > > {
856
906
let handle_state = self . db . cf_handle ( STATE_CF ) . expect ( CF_ERROR ) ;
@@ -933,6 +983,7 @@ mod test {
933
983
max_versioning_elements_size : 100 ,
934
984
thread_count : THREAD_COUNT ,
935
985
max_ledger_backups : 10 ,
986
+ enable_metrics : false ,
936
987
} ;
937
988
let mut db_opts = MassaDB :: default_db_opts ( ) ;
938
989
// Additional checks (only for testing)
@@ -963,6 +1014,7 @@ mod test {
963
1014
max_versioning_elements_size : 100 ,
964
1015
thread_count : THREAD_COUNT ,
965
1016
max_ledger_backups : 10 ,
1017
+ enable_metrics : false ,
966
1018
} ;
967
1019
let mut db_opts = MassaDB :: default_db_opts ( ) ;
968
1020
// Additional checks (only for testing)
@@ -1047,6 +1099,7 @@ mod test {
1047
1099
max_versioning_elements_size : 100 ,
1048
1100
thread_count : THREAD_COUNT ,
1049
1101
max_ledger_backups : 10 ,
1102
+ enable_metrics : false ,
1050
1103
} ;
1051
1104
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1052
1105
// Additional checks (only for testing)
@@ -1132,6 +1185,7 @@ mod test {
1132
1185
max_versioning_elements_size : 100 ,
1133
1186
thread_count : THREAD_COUNT ,
1134
1187
max_ledger_backups : 10 ,
1188
+ enable_metrics : false ,
1135
1189
} ;
1136
1190
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1137
1191
// Additional checks (only for testing)
@@ -1181,6 +1235,7 @@ mod test {
1181
1235
max_versioning_elements_size : 100 ,
1182
1236
thread_count : THREAD_COUNT ,
1183
1237
max_ledger_backups : 10 ,
1238
+ enable_metrics : false ,
1184
1239
} ;
1185
1240
let mut db_backup_1_opts = MassaDB :: default_db_opts ( ) ;
1186
1241
db_backup_1_opts. create_if_missing ( false ) ;
@@ -1205,6 +1260,7 @@ mod test {
1205
1260
max_versioning_elements_size : 100 ,
1206
1261
thread_count : THREAD_COUNT ,
1207
1262
max_ledger_backups : 10 ,
1263
+ enable_metrics : false ,
1208
1264
} ;
1209
1265
let mut db_backup_2_opts = MassaDB :: default_db_opts ( ) ;
1210
1266
db_backup_2_opts. create_if_missing ( false ) ;
@@ -1238,6 +1294,7 @@ mod test {
1238
1294
max_versioning_elements_size : 100 ,
1239
1295
thread_count : THREAD_COUNT ,
1240
1296
max_ledger_backups : 10 ,
1297
+ enable_metrics : false ,
1241
1298
} ;
1242
1299
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1243
1300
// Additional checks (only for testing)
@@ -1285,6 +1342,7 @@ mod test {
1285
1342
max_versioning_elements_size : 100 ,
1286
1343
thread_count : THREAD_COUNT ,
1287
1344
max_ledger_backups : 10 ,
1345
+ enable_metrics : false ,
1288
1346
} ;
1289
1347
// let db_backup_2_opts = MassaDB::default_db_opts();
1290
1348
@@ -1334,6 +1392,7 @@ mod test {
1334
1392
max_versioning_elements_size : 100 ,
1335
1393
thread_count : THREAD_COUNT ,
1336
1394
max_ledger_backups : 10 ,
1395
+ enable_metrics : false ,
1337
1396
} ;
1338
1397
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1339
1398
// Additional checks (only for testing)
@@ -1427,6 +1486,7 @@ mod test {
1427
1486
max_versioning_elements_size : 100 ,
1428
1487
thread_count : THREAD_COUNT ,
1429
1488
max_ledger_backups : 10 ,
1489
+ enable_metrics : false ,
1430
1490
} ;
1431
1491
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1432
1492
// Additional checks (only for testing)
@@ -1515,6 +1575,7 @@ mod test {
1515
1575
max_versioning_elements_size : 10 ,
1516
1576
thread_count : THREAD_COUNT ,
1517
1577
max_ledger_backups : 10 ,
1578
+ enable_metrics : false ,
1518
1579
} ;
1519
1580
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1520
1581
// Additional checks (only for testing)
@@ -1600,6 +1661,7 @@ mod test {
1600
1661
max_versioning_elements_size : 20 ,
1601
1662
thread_count : THREAD_COUNT ,
1602
1663
max_ledger_backups : 10 ,
1664
+ enable_metrics : false ,
1603
1665
} ;
1604
1666
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1605
1667
// Additional checks (only for testing)
@@ -1712,6 +1774,7 @@ mod test {
1712
1774
max_versioning_elements_size : 20 ,
1713
1775
thread_count : THREAD_COUNT ,
1714
1776
max_ledger_backups : 10 ,
1777
+ enable_metrics : false ,
1715
1778
} ;
1716
1779
1717
1780
let slot_1 = Slot :: new ( 1 , 0 ) ;
0 commit comments