@@ -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,6 +391,12 @@ where
389
391
}
390
392
}
391
393
394
+ let changes_size = if self . config . enable_metrics {
395
+ self . current_batch . lock ( ) . size_in_bytes ( )
396
+ } else {
397
+ 0
398
+ } ;
399
+
392
400
// in versioning_changes, we have the data that we do not want to include in hash
393
401
// e.g everything that is not in 'Active' state (so hashes remain compatibles)
394
402
for ( key, value) in versioning_changes. iter ( ) {
@@ -401,6 +409,30 @@ where
401
409
}
402
410
}
403
411
412
+ let changes_versioning_size = if self . config . enable_metrics {
413
+ self . current_batch
414
+ . lock ( )
415
+ . size_in_bytes ( )
416
+ . saturating_sub ( changes_size)
417
+ } else {
418
+ 0
419
+ } ;
420
+
421
+ if self . config . enable_metrics {
422
+ match self
423
+ . change_history_sizes
424
+ . entry ( self . get_change_id ( ) . expect ( CHANGE_ID_DESER_ERROR ) )
425
+ {
426
+ std:: collections:: btree_map:: Entry :: Vacant ( entry) => {
427
+ entry. insert ( ( changes_size, changes_versioning_size) ) ;
428
+ }
429
+ std:: collections:: btree_map:: Entry :: Occupied ( mut entry) => {
430
+ entry. get_mut ( ) . 0 += changes_size;
431
+ entry. get_mut ( ) . 1 += changes_versioning_size;
432
+ }
433
+ }
434
+ }
435
+
404
436
if let Some ( change_id) = change_id {
405
437
self . set_change_id_to_batch ( change_id) ;
406
438
}
@@ -447,10 +479,12 @@ where
447
479
if reset_history {
448
480
self . change_history . clear ( ) ;
449
481
self . change_history_versioning . clear ( ) ;
482
+ self . change_history_sizes . clear ( ) ;
450
483
}
451
484
452
485
while self . change_history . len ( ) > self . config . max_history_length {
453
486
self . change_history . pop_first ( ) ;
487
+ self . change_history_sizes . pop_first ( ) ;
454
488
}
455
489
456
490
while self . change_history_versioning . len ( ) > self . config . max_history_length {
@@ -614,6 +648,7 @@ impl RawMassaDB<Slot, SlotSerializer, SlotDeserializer> {
614
648
config,
615
649
change_history : BTreeMap :: new ( ) ,
616
650
change_history_versioning : BTreeMap :: new ( ) ,
651
+ change_history_sizes : BTreeMap :: new ( ) ,
617
652
change_id_serializer : SlotSerializer :: new ( ) ,
618
653
change_id_deserializer,
619
654
current_batch,
@@ -851,6 +886,16 @@ impl MassaDBController for RawMassaDB<Slot, SlotSerializer, SlotDeserializer> {
851
886
self . get_versioning_batch_to_stream ( last_versioning_step, last_change_id)
852
887
}
853
888
889
+ fn get_change_history_sizes ( & self ) -> ( usize , usize ) {
890
+ let mut change_history_size = 0 ;
891
+ let mut change_history_versioning_size = 0 ;
892
+ for ( state_size, versioning_size) in self . change_history_sizes . values ( ) {
893
+ change_history_size += state_size;
894
+ change_history_versioning_size += versioning_size;
895
+ }
896
+ ( change_history_size, change_history_versioning_size)
897
+ }
898
+
854
899
#[ cfg( feature = "test-exports" ) ]
855
900
fn get_entire_database ( & self ) -> Vec < BTreeMap < Vec < u8 > , Vec < u8 > > > {
856
901
let handle_state = self . db . cf_handle ( STATE_CF ) . expect ( CF_ERROR ) ;
@@ -933,6 +978,7 @@ mod test {
933
978
max_versioning_elements_size : 100 ,
934
979
thread_count : THREAD_COUNT ,
935
980
max_ledger_backups : 10 ,
981
+ enable_metrics : true ,
936
982
} ;
937
983
let mut db_opts = MassaDB :: default_db_opts ( ) ;
938
984
// Additional checks (only for testing)
@@ -963,6 +1009,7 @@ mod test {
963
1009
max_versioning_elements_size : 100 ,
964
1010
thread_count : THREAD_COUNT ,
965
1011
max_ledger_backups : 10 ,
1012
+ enable_metrics : true ,
966
1013
} ;
967
1014
let mut db_opts = MassaDB :: default_db_opts ( ) ;
968
1015
// Additional checks (only for testing)
@@ -1047,6 +1094,7 @@ mod test {
1047
1094
max_versioning_elements_size : 100 ,
1048
1095
thread_count : THREAD_COUNT ,
1049
1096
max_ledger_backups : 10 ,
1097
+ enable_metrics : true ,
1050
1098
} ;
1051
1099
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1052
1100
// Additional checks (only for testing)
@@ -1132,6 +1180,7 @@ mod test {
1132
1180
max_versioning_elements_size : 100 ,
1133
1181
thread_count : THREAD_COUNT ,
1134
1182
max_ledger_backups : 10 ,
1183
+ enable_metrics : true ,
1135
1184
} ;
1136
1185
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1137
1186
// Additional checks (only for testing)
@@ -1181,6 +1230,7 @@ mod test {
1181
1230
max_versioning_elements_size : 100 ,
1182
1231
thread_count : THREAD_COUNT ,
1183
1232
max_ledger_backups : 10 ,
1233
+ enable_metrics : true ,
1184
1234
} ;
1185
1235
let mut db_backup_1_opts = MassaDB :: default_db_opts ( ) ;
1186
1236
db_backup_1_opts. create_if_missing ( false ) ;
@@ -1205,6 +1255,7 @@ mod test {
1205
1255
max_versioning_elements_size : 100 ,
1206
1256
thread_count : THREAD_COUNT ,
1207
1257
max_ledger_backups : 10 ,
1258
+ enable_metrics : true ,
1208
1259
} ;
1209
1260
let mut db_backup_2_opts = MassaDB :: default_db_opts ( ) ;
1210
1261
db_backup_2_opts. create_if_missing ( false ) ;
@@ -1238,6 +1289,7 @@ mod test {
1238
1289
max_versioning_elements_size : 100 ,
1239
1290
thread_count : THREAD_COUNT ,
1240
1291
max_ledger_backups : 10 ,
1292
+ enable_metrics : true ,
1241
1293
} ;
1242
1294
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1243
1295
// Additional checks (only for testing)
@@ -1285,6 +1337,7 @@ mod test {
1285
1337
max_versioning_elements_size : 100 ,
1286
1338
thread_count : THREAD_COUNT ,
1287
1339
max_ledger_backups : 10 ,
1340
+ enable_metrics : true ,
1288
1341
} ;
1289
1342
// let db_backup_2_opts = MassaDB::default_db_opts();
1290
1343
@@ -1334,6 +1387,7 @@ mod test {
1334
1387
max_versioning_elements_size : 100 ,
1335
1388
thread_count : THREAD_COUNT ,
1336
1389
max_ledger_backups : 10 ,
1390
+ enable_metrics : true ,
1337
1391
} ;
1338
1392
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1339
1393
// Additional checks (only for testing)
@@ -1427,6 +1481,7 @@ mod test {
1427
1481
max_versioning_elements_size : 100 ,
1428
1482
thread_count : THREAD_COUNT ,
1429
1483
max_ledger_backups : 10 ,
1484
+ enable_metrics : true ,
1430
1485
} ;
1431
1486
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1432
1487
// Additional checks (only for testing)
@@ -1515,6 +1570,7 @@ mod test {
1515
1570
max_versioning_elements_size : 10 ,
1516
1571
thread_count : THREAD_COUNT ,
1517
1572
max_ledger_backups : 10 ,
1573
+ enable_metrics : true ,
1518
1574
} ;
1519
1575
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1520
1576
// Additional checks (only for testing)
@@ -1600,6 +1656,7 @@ mod test {
1600
1656
max_versioning_elements_size : 20 ,
1601
1657
thread_count : THREAD_COUNT ,
1602
1658
max_ledger_backups : 10 ,
1659
+ enable_metrics : true ,
1603
1660
} ;
1604
1661
let mut db_opts = MassaDB :: default_db_opts ( ) ;
1605
1662
// Additional checks (only for testing)
@@ -1712,6 +1769,7 @@ mod test {
1712
1769
max_versioning_elements_size : 20 ,
1713
1770
thread_count : THREAD_COUNT ,
1714
1771
max_ledger_backups : 10 ,
1772
+ enable_metrics : true ,
1715
1773
} ;
1716
1774
1717
1775
let slot_1 = Slot :: new ( 1 , 0 ) ;
0 commit comments