From 5994b6cbd1bcee2452ee390672b36bf3de50ea66 Mon Sep 17 00:00:00 2001 From: Hubert Bugaj Date: Fri, 13 Mar 2026 18:10:22 +0100 Subject: [PATCH 1/2] chore: parallelize some calls with `tokio::try_join!` --- src/cli/subcommands/f3_cmd.rs | 19 +++++++++++-------- src/cli/subcommands/mpool_cmd.rs | 8 ++++---- src/daemon/context.rs | 6 ++++-- src/networks/actors_bundle.rs | 6 ++++-- src/tool/subcommands/snapshot_cmd.rs | 11 ++++++----- src/wallet/subcommands/wallet_cmd.rs | 4 ++-- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/cli/subcommands/f3_cmd.rs b/src/cli/subcommands/f3_cmd.rs index 1dbde2088599..ae7ff4cadcc6 100644 --- a/src/cli/subcommands/f3_cmd.rs +++ b/src/cli/subcommands/f3_cmd.rs @@ -152,8 +152,10 @@ impl F3Commands { async fn get_heads( client: &rpc::Client, ) -> anyhow::Result<(Tipset, FinalityCertificate)> { - let cert_head = client.call(F3GetLatestCertificate::request(())?).await?; - let chain_head = client.call(ChainHead::request(())?).await?; + let (cert_head, chain_head) = tokio::try_join!( + client.call(F3GetLatestCertificate::request(())?), + client.call(ChainHead::request(())?), + )?; Ok((chain_head, cert_head)) } @@ -468,12 +470,13 @@ impl F3PowerTableCommands { )); } - let previous = F3GetCertificate::call(client, (instance.saturating_sub(1),)).await?; - let lookback = F3GetCertificate::call( - client, - (instance.saturating_sub(manifest.committee_lookback),), - ) - .await?; + let (previous, lookback) = tokio::try_join!( + F3GetCertificate::call(client, (instance.saturating_sub(1),)), + F3GetCertificate::call( + client, + (instance.saturating_sub(manifest.committee_lookback),) + ), + )?; let tsk = lookback.ec_chain.last().key.clone(); Ok((tsk, previous.supplemental_data.power_table)) } diff --git a/src/cli/subcommands/mpool_cmd.rs b/src/cli/subcommands/mpool_cmd.rs index 2cd302107a2f..c182a3414486 100644 --- a/src/cli/subcommands/mpool_cmd.rs +++ b/src/cli/subcommands/mpool_cmd.rs @@ -237,12 +237,12 @@ impl MpoolCommands { let tipset = ChainHead::call(&client, ()).await?; let curr_base_fee = tipset.block_headers().first().parent_base_fee.to_owned(); - let atto_str = ChainGetMinBaseFee::call(&client, (basefee_lookback,)).await?; + let (atto_str, NotNullVec(messages)) = tokio::try_join!( + ChainGetMinBaseFee::call(&client, (basefee_lookback,)), + MpoolPending::call(&client, (ApiTipsetKey(None),)), + )?; let min_base_fee = TokenAmount::from_atto(atto_str.parse::()?); - let NotNullVec(messages) = - MpoolPending::call(&client, (ApiTipsetKey(None),)).await?; - let local_addrs = if local { let response = WalletList::call(&client, ()).await?; Some(HashSet::from_iter(response)) diff --git a/src/daemon/context.rs b/src/daemon/context.rs index f6a60538967d..45616880f62c 100644 --- a/src/daemon/context.rs +++ b/src/daemon/context.rs @@ -47,8 +47,10 @@ impl AppContext { let chain_cfg = get_chain_config_and_set_network(cfg); let (net_keypair, p2p_peer_id) = get_or_create_p2p_keypair_and_peer_id(cfg)?; let (db, db_meta_data) = setup_db(opts, cfg).await?; - let state_manager = create_state_manager(cfg, &db, &chain_cfg).await?; - let (keystore, admin_jwt) = load_or_create_keystore_and_configure_jwt(opts, cfg).await?; + let (state_manager, (keystore, admin_jwt)) = tokio::try_join!( + create_state_manager(cfg, &db, &chain_cfg), + load_or_create_keystore_and_configure_jwt(opts, cfg), + )?; let snapshot_progress_tracker = SnapshotProgressTracker::default(); Ok(Self { net_keypair, diff --git a/src/networks/actors_bundle.rs b/src/networks/actors_bundle.rs index f961e9511b36..2c5d35f4c5c9 100644 --- a/src/networks/actors_bundle.rs +++ b/src/networks/actors_bundle.rs @@ -293,8 +293,10 @@ mod tests { _ => return anyhow::Ok(()), }; - let car_primary = CarStream::new(Cursor::new(primary)).await?; - let car_secondary = CarStream::new(Cursor::new(alt)).await?; + let (car_primary, car_secondary) = tokio::try_join!( + CarStream::new(Cursor::new(primary)), + CarStream::new(Cursor::new(alt)), + )?; assert_eq!( car_primary.header_v1.roots, car_secondary.header_v1.roots, diff --git a/src/tool/subcommands/snapshot_cmd.rs b/src/tool/subcommands/snapshot_cmd.rs index fafeffbbfb11..f45a0cd3f010 100644 --- a/src/tool/subcommands/snapshot_cmd.rs +++ b/src/tool/subcommands/snapshot_cmd.rs @@ -414,15 +414,16 @@ where // causing out-of-bounds errors when the snapshot contains only 900 recent state roots. let last_epoch = ts.epoch() - epochs as i64 + 1; - // Bundles are required when doing state migrations. - load_actor_bundles(&db, &network).await?; - - // Set proof parameter data dir and make sure the proofs are available + // Set proof parameter data dir before downloading proofs. crate::utils::proofs_api::maybe_set_proofs_parameter_cache_dir_env( &Config::default().client.data_dir, ); - ensure_proof_params_downloaded().await?; + // independent downloads - fetch in parallel + tokio::try_join!( + load_actor_bundles(&db, &network), + ensure_proof_params_downloaded(), + )?; let chain_index = Arc::new(ChainIndex::new(Arc::new(db.clone()))); diff --git a/src/wallet/subcommands/wallet_cmd.rs b/src/wallet/subcommands/wallet_cmd.rs index 62cb3f6c8fa2..c7b74a69448c 100644 --- a/src/wallet/subcommands/wallet_cmd.rs +++ b/src/wallet/subcommands/wallet_cmd.rs @@ -407,8 +407,8 @@ impl WalletCommands { no_round, no_abbrev, } => { - let key_pairs = backend.list_addrs().await?; - let default = backend.wallet_default_address().await?; + let (key_pairs, default) = + tokio::try_join!(backend.list_addrs(), backend.wallet_default_address(),)?; let max_addr_len = key_pairs .iter() From 5a2f3905e6da5f15e9814e7ac559d052698864e3 Mon Sep 17 00:00:00 2001 From: Hubert Bugaj Date: Sat, 14 Mar 2026 14:38:27 +0100 Subject: [PATCH 2/2] revert unsound parallelization --- src/daemon/context.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/daemon/context.rs b/src/daemon/context.rs index 45616880f62c..f6a60538967d 100644 --- a/src/daemon/context.rs +++ b/src/daemon/context.rs @@ -47,10 +47,8 @@ impl AppContext { let chain_cfg = get_chain_config_and_set_network(cfg); let (net_keypair, p2p_peer_id) = get_or_create_p2p_keypair_and_peer_id(cfg)?; let (db, db_meta_data) = setup_db(opts, cfg).await?; - let (state_manager, (keystore, admin_jwt)) = tokio::try_join!( - create_state_manager(cfg, &db, &chain_cfg), - load_or_create_keystore_and_configure_jwt(opts, cfg), - )?; + let state_manager = create_state_manager(cfg, &db, &chain_cfg).await?; + let (keystore, admin_jwt) = load_or_create_keystore_and_configure_jwt(opts, cfg).await?; let snapshot_progress_tracker = SnapshotProgressTracker::default(); Ok(Self { net_keypair,