From e78b0724c63c5058d88b632920485d9c1d655e98 Mon Sep 17 00:00:00 2001 From: Pravdyvy Date: Wed, 22 Jul 2026 16:19:40 +0300 Subject: [PATCH] feat(wallet): parallel actualization owned --- lez/wallet/src/multi_client.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/lez/wallet/src/multi_client.rs b/lez/wallet/src/multi_client.rs index d987c55c..a2c6ca17 100644 --- a/lez/wallet/src/multi_client.rs +++ b/lez/wallet/src/multi_client.rs @@ -13,7 +13,7 @@ use anyhow::{Context as _, Result}; use lee_core::BlockId; use sequencer_service_rpc::{RpcClient as _, SequencerClient, SequencerClientBuilder}; use serde::{Deserialize, Serialize}; -use tokio::sync::RwLock; +use tokio::{sync::RwLock, task::JoinSet}; use url::Url; use crate::config::{MultiSequencerClientConfig, SequencerConnectionData}; @@ -450,7 +450,7 @@ pub async fn calibrate_client( }) } -pub async fn actualize_client(client: &SequencerClient) -> StatisticsUpdate { +async fn actualize_client(client: &SequencerClient) -> StatisticsUpdate { let (latency, block_id) = measure_request_duration(client).await; #[expect(clippy::as_conversions, reason = "int to float conversion is safe")] @@ -464,6 +464,36 @@ pub async fn actualize_client(client: &SequencerClient) -> StatisticsUpdate { }) } +async fn actualize_client_owned(client: SequencerClient) -> StatisticsUpdate { + let (latency, block_id) = measure_request_duration(&client).await; + + #[expect(clippy::as_conversions, reason = "int to float conversion is safe")] + let latency = latency as f32; + + block_id.map_or(StatisticsUpdate::Failure, |new_latest_block_id| { + StatisticsUpdate::Success { + latency, + new_latest_block_id, + } + }) +} + +pub async fn multi_actualize_clients(clients: &[SequencerClient]) -> Vec { + let mut join_set = JoinSet::new(); + + for client in clients { + join_set.spawn(actualize_client_owned(client.clone())); + } + + let mut statistic_updates = vec![]; + + while let Some(statistic_resp) = join_set.join_next().await { + statistic_updates.push(statistic_resp.unwrap_or(StatisticsUpdate::Failure)); + } + + statistic_updates +} + #[must_use] pub fn choose_leaders( client_list: &HashMap,