sui_rpc_loadgen/payload/
checkpoint_utils.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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}