iota_rpc_loadgen/payload/
checkpoint_utils.rs1use std::{fmt, fmt::Display};
6
7use futures::future::join_all;
8use iota_sdk::IotaClient;
9use iota_types::messages_checkpoint::CheckpointSequenceNumber;
10
11pub(crate) struct CheckpointStats {
12 pub latest_checkpoints: Vec<CheckpointSequenceNumber>,
13}
14
15impl CheckpointStats {
16 pub fn max_latest_checkpoint(&self) -> CheckpointSequenceNumber {
17 *self
18 .latest_checkpoints
19 .iter()
20 .max()
21 .expect("get_latest_checkpoint_sequence_number should not return empty")
22 }
23
24 pub fn min_latest_checkpoint(&self) -> CheckpointSequenceNumber {
25 *self
26 .latest_checkpoints
27 .iter()
28 .min()
29 .expect("get_latest_checkpoint_sequence_number should not return empty")
30 }
31
32 pub fn max_lag(&self) -> u64 {
33 self.max_latest_checkpoint() - self.min_latest_checkpoint()
34 }
35}
36
37impl Display for CheckpointStats {
38 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39 write!(
40 f,
41 "Max Checkpoint {}, Min Checkpoint {}, Max Lag {}. All latest checkpoints {:?}",
42 self.max_latest_checkpoint(),
43 self.min_latest_checkpoint(),
44 self.max_lag(),
45 self.latest_checkpoints
46 )
47 }
48}
49
50pub(crate) async fn get_latest_checkpoint_stats(
51 clients: &[IotaClient],
52 end_checkpoint: Option<CheckpointSequenceNumber>,
53) -> CheckpointStats {
54 let latest_checkpoints: Vec<CheckpointSequenceNumber> =
55 join_all(clients.iter().map(|client| async {
56 match end_checkpoint {
57 Some(e) => e,
58 None => client
59 .read_api()
60 .get_latest_checkpoint_sequence_number()
61 .await
62 .expect("get_latest_checkpoint_sequence_number should not fail"),
63 }
64 }))
65 .await;
66
67 CheckpointStats { latest_checkpoints }
68}