iota_rpc_loadgen/payload/
checkpoint_utils.rs

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