Skip to content

Commit bc191c2

Browse files
authored
feat(fortuna): Speedup setup provider (#1673)
Run setup tasks in parallel for each chain Short circuit if chain length does not match
1 parent ed4778c commit bc191c2

File tree

3 files changed

+67
-28
lines changed

3 files changed

+67
-28
lines changed

apps/fortuna/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/fortuna/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "fortuna"
3-
version = "6.3.0"
3+
version = "6.3.1"
44
edition = "2021"
55

66
[dependencies]

apps/fortuna/src/command/setup_provider.rs

Lines changed: 65 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,46 @@ use {
3737
Bytes,
3838
},
3939
},
40+
futures::future::join_all,
4041
std::sync::Arc,
42+
tokio::spawn,
4143
tracing::Instrument,
4244
};
4345

4446
/// Setup provider for all the chains.
4547
pub async fn setup_provider(opts: &SetupProviderOptions) -> Result<()> {
4648
let config = Config::load(&opts.config.config)?;
47-
for (chain_id, chain_config) in &config.chains {
48-
setup_chain_provider(&config, &chain_id, &chain_config).await?;
49+
let setup_tasks = config
50+
.chains
51+
.clone()
52+
.into_iter()
53+
.map(|(chain_id, chain_config)| {
54+
let config = config.clone();
55+
spawn(async move {
56+
(
57+
setup_chain_provider(&config, &chain_id, &chain_config).await,
58+
chain_id,
59+
)
60+
})
61+
})
62+
.collect::<Vec<_>>();
63+
let join_results = join_all(setup_tasks).await;
64+
let mut all_ok = true;
65+
for join_result in join_results {
66+
let (setup_result, chain_id) = join_result?;
67+
match setup_result {
68+
Ok(()) => {}
69+
Err(e) => {
70+
tracing::error!("Failed to setup {} {}", chain_id, e);
71+
all_ok = false;
72+
}
73+
}
74+
}
75+
76+
match all_ok {
77+
true => Ok(()),
78+
false => Err(anyhow!("Failed to setup provider for all chains")),
4979
}
50-
Ok(())
5180
}
5281

5382

@@ -57,7 +86,7 @@ pub async fn setup_provider(opts: &SetupProviderOptions) -> Result<()> {
5786
/// 3. Re-register if there is a mismatch in generated hash chain.
5887
/// 4. Update provider fee if there is a mismatch with the fee set on contract.
5988
/// 5. Update provider uri if there is a mismatch with the uri set on contract.
60-
#[tracing::instrument(name="setup_chain_provider", skip_all, fields(chain_id=chain_id))]
89+
#[tracing::instrument(name = "setup_chain_provider", skip_all, fields(chain_id = chain_id))]
6190
async fn setup_chain_provider(
6291
config: &Config,
6392
chain_id: &ChainId,
@@ -101,31 +130,41 @@ async fn setup_chain_provider(
101130
let secret = provider_config.secret.load()?.ok_or(anyhow!(
102131
"Please specify a provider secret in the config file."
103132
))?;
104-
let hash_chain = PebbleHashChain::from_config(
105-
&secret,
106-
&chain_id,
107-
&provider_address,
108-
&chain_config.contract_addr,
109-
&metadata.seed,
110-
provider_config.chain_length,
111-
provider_config.chain_sample_interval,
112-
)?;
113-
let chain_state = HashChainState {
114-
offsets: vec![provider_info
115-
.original_commitment_sequence_number
116-
.try_into()?],
117-
hash_chains: vec![hash_chain],
118-
};
119-
120-
121-
if chain_state.reveal(provider_info.original_commitment_sequence_number)?
122-
!= provider_info.original_commitment
123-
{
124-
tracing::info!("The root of the generated hash chain does not match the commitment",);
133+
if metadata.chain_length != provider_config.chain_length {
134+
tracing::info!(
135+
"Chain length mismatch. metadata.chain_length={}, provider_config.chain_length={}",
136+
metadata.chain_length,
137+
provider_config.chain_length
138+
);
125139
register = true;
140+
} else {
141+
let hash_chain = PebbleHashChain::from_config(
142+
&secret,
143+
&chain_id,
144+
&provider_address,
145+
&chain_config.contract_addr,
146+
&metadata.seed,
147+
provider_config.chain_length,
148+
provider_config.chain_sample_interval,
149+
)?;
150+
let chain_state = HashChainState {
151+
offsets: vec![provider_info
152+
.original_commitment_sequence_number
153+
.try_into()?],
154+
hash_chains: vec![hash_chain],
155+
};
156+
157+
158+
if chain_state.reveal(provider_info.original_commitment_sequence_number)?
159+
!= provider_info.original_commitment
160+
{
161+
tracing::info!(
162+
"The root of the generated hash chain does not match the commitment",
163+
);
164+
register = true;
165+
}
126166
}
127167
}
128-
129168
if register {
130169
tracing::info!("Registering");
131170
register_provider_from_config(&provider_config, &chain_id, &chain_config)

0 commit comments

Comments
 (0)