Skip to content

Commit 2a8b9ac

Browse files
add metric for event cache and other missing metrics (#4863)
* add metric for event cache * Fix sub metrics * Add metrics for massa-db-worker change history sizes * Add lru_cache_memory_usage metric * Disable db metrics for tests * Refactor db metrics & lock handling * Review comment * Add active history events len --------- Co-authored-by: Leo-Besancon <lb@massa.net>
1 parent fd2f8f0 commit 2a8b9ac

File tree

30 files changed

+258
-34
lines changed

30 files changed

+258
-34
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

massa-async-pool/src/pool.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,7 @@ mod tests {
11001100
max_versioning_elements_size: 100,
11011101
thread_count: THREAD_COUNT,
11021102
max_ledger_backups: 100,
1103+
enable_metrics: false,
11031104
};
11041105
let db: ShareableMassaDBController = Arc::new(RwLock::new(
11051106
Box::new(MassaDB::new(db_config)) as Box<(dyn MassaDBController + 'static)>,
@@ -1142,6 +1143,7 @@ mod tests {
11421143
max_versioning_elements_size: 100,
11431144
thread_count: THREAD_COUNT,
11441145
max_ledger_backups: 100,
1146+
enable_metrics: false,
11451147
};
11461148
let db: ShareableMassaDBController = Arc::new(RwLock::new(
11471149
Box::new(MassaDB::new(db_config)) as Box<(dyn MassaDBController + 'static)>,
@@ -1204,6 +1206,7 @@ mod tests {
12041206
max_versioning_elements_size: 100,
12051207
thread_count: THREAD_COUNT,
12061208
max_ledger_backups: 100,
1209+
enable_metrics: false,
12071210
};
12081211
let db: ShareableMassaDBController = Arc::new(RwLock::new(
12091212
Box::new(MassaDB::new(db_config)) as Box<(dyn MassaDBController + 'static)>,
@@ -1261,6 +1264,7 @@ mod tests {
12611264
max_versioning_elements_size: 100,
12621265
thread_count: THREAD_COUNT,
12631266
max_ledger_backups: 100,
1267+
enable_metrics: false,
12641268
};
12651269
let db: ShareableMassaDBController = Arc::new(RwLock::new(
12661270
Box::new(MassaDB::new(db_config)) as Box<(dyn MassaDBController + 'static)>,
@@ -1318,6 +1322,7 @@ mod tests {
13181322
max_versioning_elements_size: 100,
13191323
thread_count: THREAD_COUNT,
13201324
max_ledger_backups: 100,
1325+
enable_metrics: false,
13211326
};
13221327
let db: ShareableMassaDBController = Arc::new(RwLock::new(
13231328
Box::new(MassaDB::new(db_config)) as Box<(dyn MassaDBController + 'static)>,
@@ -1368,6 +1373,7 @@ mod tests {
13681373
max_versioning_elements_size: 100,
13691374
thread_count: THREAD_COUNT,
13701375
max_ledger_backups: 100,
1376+
enable_metrics: false,
13711377
};
13721378
let db: ShareableMassaDBController = Arc::new(RwLock::new(Box::new(MassaDB::new(
13731379
db_config.clone(),

massa-bootstrap/src/tests/binders.rs

+3
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ fn test_staying_connected_without_message_trigger_read_timeout() {
451451
max_versioning_elements_size: 100_000_000,
452452
thread_count: THREAD_COUNT,
453453
max_ledger_backups: 10,
454+
enable_metrics: false,
454455
}))
455456
as Box<(dyn MassaDBController + 'static)>));
456457
let rolls_path = PathBuf::from_str("../massa-node/base_config/initial_rolls.json").unwrap();
@@ -549,6 +550,7 @@ fn test_staying_connected_pass_handshake_but_deadline_after() {
549550
max_versioning_elements_size: 100_000_000,
550551
thread_count: THREAD_COUNT,
551552
max_ledger_backups: 10,
553+
enable_metrics: false,
552554
}))
553555
as Box<(dyn MassaDBController + 'static)>));
554556
let rolls_path = PathBuf::from_str("../massa-node/base_config/initial_rolls.json").unwrap();
@@ -647,6 +649,7 @@ fn test_staying_connected_pass_handshake_but_deadline_during_data_exchange() {
647649
max_versioning_elements_size: 100_000_000,
648650
thread_count: THREAD_COUNT,
649651
max_ledger_backups: 10,
652+
enable_metrics: false,
650653
}))
651654
as Box<(dyn MassaDBController + 'static)>));
652655
let rolls_path = PathBuf::from_str("../massa-node/base_config/initial_rolls.json").unwrap();

massa-bootstrap/src/tests/universe_client.rs

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ impl TestUniverse for BootstrapClientTestUniverse {
6060
max_final_state_elements_size: MAX_BOOTSTRAP_FINAL_STATE_PARTS_SIZE as usize,
6161
thread_count: THREAD_COUNT,
6262
max_ledger_backups: 10,
63+
enable_metrics: false,
6364
}))
6465
as Box<(dyn MassaDBController + 'static)>));
6566
controllers

massa-bootstrap/src/tests/universe_server.rs

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ impl BootstrapServerForeignControllers {
5757
max_final_state_elements_size: MAX_BOOTSTRAP_FINAL_STATE_PARTS_SIZE as usize,
5858
thread_count: THREAD_COUNT,
5959
max_ledger_backups: 10,
60+
enable_metrics: false,
6061
}))
6162
as Box<(dyn MassaDBController + 'static)>));
6263
Self {

massa-db-exports/src/controller.rs

+3
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ pub trait MassaDBController: Send + Sync + Debug {
8888
last_change_id: Option<Slot>,
8989
) -> Result<StreamBatch<Slot>, MassaDBError>;
9090

91+
/// Get the total size of the change history and the change versioning history respectively
92+
fn get_change_history_sizes(&self) -> (usize, usize);
93+
9194
/// Used in test to compare a prebuilt ledger with a ledger that has been built by the code
9295
#[cfg(feature = "test-exports")]
9396
fn get_entire_database(&self) -> Vec<BTreeMap<Vec<u8>, Vec<u8>>>;

massa-db-exports/src/settings.rs

+2
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ pub struct MassaDBConfig {
1515
pub thread_count: u8,
1616
/// Maximum number of ledger backups to keep
1717
pub max_ledger_backups: u64,
18+
/// Enable metrics
19+
pub enable_metrics: bool,
1820
}

massa-db-worker/src/massa_db.rs

+72-9
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ pub struct RawMassaDB<
5454
pub change_id_deserializer: ChangeIDDeserializer,
5555
/// The current RocksDB batch of the database, in a Mutex to share it
5656
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)>,
5759
}
5860

5961
impl<ChangeID, ChangeIDSerializer, ChangeIDDeserializer> std::fmt::Debug
@@ -389,15 +391,51 @@ where
389391
}
390392
}
391393

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+
}
401439
}
402440
}
403441

@@ -447,10 +485,12 @@ where
447485
if reset_history {
448486
self.change_history.clear();
449487
self.change_history_versioning.clear();
488+
self.change_history_sizes.clear();
450489
}
451490

452491
while self.change_history.len() > self.config.max_history_length {
453492
self.change_history.pop_first();
493+
self.change_history_sizes.pop_first();
454494
}
455495

456496
while self.change_history_versioning.len() > self.config.max_history_length {
@@ -614,6 +654,7 @@ impl RawMassaDB<Slot, SlotSerializer, SlotDeserializer> {
614654
config,
615655
change_history: BTreeMap::new(),
616656
change_history_versioning: BTreeMap::new(),
657+
change_history_sizes: BTreeMap::new(),
617658
change_id_serializer: SlotSerializer::new(),
618659
change_id_deserializer,
619660
current_batch,
@@ -851,6 +892,15 @@ impl MassaDBController for RawMassaDB<Slot, SlotSerializer, SlotDeserializer> {
851892
self.get_versioning_batch_to_stream(last_versioning_step, last_change_id)
852893
}
853894

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+
854904
#[cfg(feature = "test-exports")]
855905
fn get_entire_database(&self) -> Vec<BTreeMap<Vec<u8>, Vec<u8>>> {
856906
let handle_state = self.db.cf_handle(STATE_CF).expect(CF_ERROR);
@@ -933,6 +983,7 @@ mod test {
933983
max_versioning_elements_size: 100,
934984
thread_count: THREAD_COUNT,
935985
max_ledger_backups: 10,
986+
enable_metrics: false,
936987
};
937988
let mut db_opts = MassaDB::default_db_opts();
938989
// Additional checks (only for testing)
@@ -963,6 +1014,7 @@ mod test {
9631014
max_versioning_elements_size: 100,
9641015
thread_count: THREAD_COUNT,
9651016
max_ledger_backups: 10,
1017+
enable_metrics: false,
9661018
};
9671019
let mut db_opts = MassaDB::default_db_opts();
9681020
// Additional checks (only for testing)
@@ -1047,6 +1099,7 @@ mod test {
10471099
max_versioning_elements_size: 100,
10481100
thread_count: THREAD_COUNT,
10491101
max_ledger_backups: 10,
1102+
enable_metrics: false,
10501103
};
10511104
let mut db_opts = MassaDB::default_db_opts();
10521105
// Additional checks (only for testing)
@@ -1132,6 +1185,7 @@ mod test {
11321185
max_versioning_elements_size: 100,
11331186
thread_count: THREAD_COUNT,
11341187
max_ledger_backups: 10,
1188+
enable_metrics: false,
11351189
};
11361190
let mut db_opts = MassaDB::default_db_opts();
11371191
// Additional checks (only for testing)
@@ -1181,6 +1235,7 @@ mod test {
11811235
max_versioning_elements_size: 100,
11821236
thread_count: THREAD_COUNT,
11831237
max_ledger_backups: 10,
1238+
enable_metrics: false,
11841239
};
11851240
let mut db_backup_1_opts = MassaDB::default_db_opts();
11861241
db_backup_1_opts.create_if_missing(false);
@@ -1205,6 +1260,7 @@ mod test {
12051260
max_versioning_elements_size: 100,
12061261
thread_count: THREAD_COUNT,
12071262
max_ledger_backups: 10,
1263+
enable_metrics: false,
12081264
};
12091265
let mut db_backup_2_opts = MassaDB::default_db_opts();
12101266
db_backup_2_opts.create_if_missing(false);
@@ -1238,6 +1294,7 @@ mod test {
12381294
max_versioning_elements_size: 100,
12391295
thread_count: THREAD_COUNT,
12401296
max_ledger_backups: 10,
1297+
enable_metrics: false,
12411298
};
12421299
let mut db_opts = MassaDB::default_db_opts();
12431300
// Additional checks (only for testing)
@@ -1285,6 +1342,7 @@ mod test {
12851342
max_versioning_elements_size: 100,
12861343
thread_count: THREAD_COUNT,
12871344
max_ledger_backups: 10,
1345+
enable_metrics: false,
12881346
};
12891347
// let db_backup_2_opts = MassaDB::default_db_opts();
12901348

@@ -1334,6 +1392,7 @@ mod test {
13341392
max_versioning_elements_size: 100,
13351393
thread_count: THREAD_COUNT,
13361394
max_ledger_backups: 10,
1395+
enable_metrics: false,
13371396
};
13381397
let mut db_opts = MassaDB::default_db_opts();
13391398
// Additional checks (only for testing)
@@ -1427,6 +1486,7 @@ mod test {
14271486
max_versioning_elements_size: 100,
14281487
thread_count: THREAD_COUNT,
14291488
max_ledger_backups: 10,
1489+
enable_metrics: false,
14301490
};
14311491
let mut db_opts = MassaDB::default_db_opts();
14321492
// Additional checks (only for testing)
@@ -1515,6 +1575,7 @@ mod test {
15151575
max_versioning_elements_size: 10,
15161576
thread_count: THREAD_COUNT,
15171577
max_ledger_backups: 10,
1578+
enable_metrics: false,
15181579
};
15191580
let mut db_opts = MassaDB::default_db_opts();
15201581
// Additional checks (only for testing)
@@ -1600,6 +1661,7 @@ mod test {
16001661
max_versioning_elements_size: 20,
16011662
thread_count: THREAD_COUNT,
16021663
max_ledger_backups: 10,
1664+
enable_metrics: false,
16031665
};
16041666
let mut db_opts = MassaDB::default_db_opts();
16051667
// Additional checks (only for testing)
@@ -1712,6 +1774,7 @@ mod test {
17121774
max_versioning_elements_size: 20,
17131775
thread_count: THREAD_COUNT,
17141776
max_ledger_backups: 10,
1777+
enable_metrics: false,
17151778
};
17161779

17171780
let slot_1 = Slot::new(1, 0);

massa-deferred-calls/src/tests/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ fn call_registry_apply_changes() {
2323
max_versioning_elements_size: 100,
2424
thread_count: THREAD_COUNT,
2525
max_ledger_backups: 100,
26+
enable_metrics: false,
2627
};
2728
let call_id_serializer = DeferredCallIdSerializer::new();
2829
let db: ShareableMassaDBController = Arc::new(RwLock::new(
@@ -75,6 +76,7 @@ fn call_registry_get_slot_calls() {
7576
max_versioning_elements_size: 100,
7677
thread_count: THREAD_COUNT,
7778
max_ledger_backups: 100,
79+
enable_metrics: false,
7880
};
7981
let call_id_serializer = DeferredCallIdSerializer::new();
8082
let db: ShareableMassaDBController = Arc::new(RwLock::new(

massa-event-cache/Cargo.toml

+16-19
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,27 @@ version = "0.1.0"
44
edition = "2021"
55

66
[features]
7-
test-exports = [
8-
"massa_models/test-exports",
9-
"mockall",
10-
"mockall_wrap"
11-
]
7+
test-exports = ["massa_models/test-exports", "mockall", "mockall_wrap"]
128

139

1410
[dependencies]
15-
nom = {workspace = true}
16-
rocksdb = {workspace = true}
17-
tracing = {workspace = true}
11+
nom = { workspace = true }
12+
rocksdb = { workspace = true }
13+
tracing = { workspace = true }
1814
parking_lot = { workspace = true }
1915
num_enum = { workspace = true }
20-
massa_models = {workspace = true}
21-
massa_serialization = {workspace = true}
22-
massa_time = {workspace = true}
23-
mockall = {workspace = true, optional = true}
24-
mockall_wrap = {workspace = true, optional = true}
16+
massa_metrics = { workspace = true }
17+
massa_models = { workspace = true }
18+
massa_serialization = { workspace = true }
19+
massa_time = { workspace = true }
20+
mockall = { workspace = true, optional = true }
21+
mockall_wrap = { workspace = true, optional = true }
2522

2623
[dev-dependencies]
27-
tempfile = {workspace = true}
28-
serial_test = {workspace = true}
29-
more-asserts = {workspace = true}
30-
rand = {workspace = true}
31-
mockall = {workspace = true}
32-
mockall_wrap = {workspace = true}
24+
tempfile = { workspace = true }
25+
serial_test = { workspace = true }
26+
more-asserts = { workspace = true }
27+
rand = { workspace = true }
28+
mockall = { workspace = true }
29+
mockall_wrap = { workspace = true }
3330
massa_models = { workspace = true, features = ["test-exports"] }

massa-event-cache/src/controller.rs

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl EventCacheController for EventCacheControllerImpl {
5959
// lock input data
6060
let mut input_data = self.input_data.1.lock();
6161
input_data.events.extend(events);
62+
massa_metrics::set_event_cache_vec_len(input_data.events.len());
6263
// Wake up the condvar in EventCacheWriterThread waiting for events
6364
self.input_data.0.notify_all();
6465
}

0 commit comments

Comments
 (0)