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