Skip to content

Commit c7a3c18

Browse files
authored
perf: spawn tokio runtime once (#5263)
* perf: spawn tokio runtime once * ci * ci: fix deny workflow * fix: use multi-thread runtime for running tests
1 parent 0396e22 commit c7a3c18

File tree

36 files changed

+313
-314
lines changed

36 files changed

+313
-314
lines changed

.github/workflows/deny.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
name: deny
2+
13
on:
24
push:
35
branches: [master]
@@ -18,3 +20,6 @@ jobs:
1820
- uses: EmbarkStudios/cargo-deny-action@v1
1921
with:
2022
command: check all
23+
# Clear out arguments to not pass `--all-features` to `cargo deny`.
24+
# `foundry-cli` has an `openssl` feature which enables banned dependencies
25+
arguments: ""

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ jobs:
8585
cargo nextest run --retries 3 --archive-file nextest-unit.tar.zst -E '${{ matrix.job.filter }}'
8686
8787
issue-repros-tests:
88-
name: issue reproduction tests / ${{ matrix.job.name }}
88+
name: issue reproduction tests / ${{ matrix.job.name }} / ${{ matrix.job.partition }}
8989
runs-on: ubuntu-latest
9090
needs: build-tests
9191
strategy:

Cargo.lock

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

anvil/tests/it/sign.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ async fn rejects_different_chain_id() {
295295
assert!(err.to_string().contains("signed for another chain"));
296296
}
297297

298-
#[tokio::test]
298+
#[tokio::test(flavor = "multi_thread")]
299299
async fn rejects_invalid_chain_id() {
300300
let (_api, handle) = spawn(NodeConfig::test()).await;
301301
let wallet = handle.dev_wallets().next().unwrap().with_chain_id(99u64);

cast/src/tx.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ mod tests {
319319
}
320320
}
321321
}
322-
#[tokio::test]
322+
#[tokio::test(flavor = "multi_thread")]
323323
async fn builder_new_non_legacy() -> eyre::Result<()> {
324324
let provider = MyProvider {};
325325
let builder =
@@ -338,7 +338,7 @@ mod tests {
338338
Ok(())
339339
}
340340

341-
#[tokio::test]
341+
#[tokio::test(flavor = "multi_thread")]
342342
async fn builder_new_legacy() -> eyre::Result<()> {
343343
let provider = MyProvider {};
344344
let builder =
@@ -354,7 +354,7 @@ mod tests {
354354
Ok(())
355355
}
356356

357-
#[tokio::test]
357+
#[tokio::test(flavor = "multi_thread")]
358358
async fn builder_fields() -> eyre::Result<()> {
359359
let provider = MyProvider {};
360360
let mut builder =
@@ -376,7 +376,7 @@ mod tests {
376376
Ok(())
377377
}
378378

379-
#[tokio::test]
379+
#[tokio::test(flavor = "multi_thread")]
380380
async fn builder_args() -> eyre::Result<()> {
381381
let provider = MyProvider {};
382382
let mut builder =

chisel/src/executor.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,13 +239,17 @@ impl SessionSource {
239239
let env = self.config.evm_opts.evm_env().await;
240240

241241
// Create an in-memory backend
242-
let backend = self.config.backend.take().unwrap_or_else(|| {
243-
let backend = Backend::spawn(
244-
self.config.evm_opts.get_fork(&self.config.foundry_config, env.clone()),
245-
);
246-
self.config.backend = Some(backend.clone());
247-
backend
248-
});
242+
let backend = match self.config.backend.take() {
243+
Some(backend) => backend,
244+
None => {
245+
let backend = Backend::spawn(
246+
self.config.evm_opts.get_fork(&self.config.foundry_config, env.clone()),
247+
)
248+
.await;
249+
self.config.backend = Some(backend.clone());
250+
backend
251+
}
252+
};
249253

250254
// Build a new executor
251255
let executor = ExecutorBuilder::default()

cli/src/cmd/cast/run.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ impl RunArgs {
9898
// can safely disable base fee checks on replaying txs because can
9999
// assume those checks already passed on confirmed txs
100100
env.cfg.disable_base_fee = true;
101-
let db = Backend::spawn(evm_opts.get_fork(&config, env.clone()));
101+
let db = Backend::spawn(evm_opts.get_fork(&config, env.clone())).await;
102102

103103
// configures a bare version of the evm executor: no cheatcode inspector is enabled,
104104
// tracing will be enabled only for the targeted transaction

cli/src/cmd/forge/coverage.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use crate::{
33
cmd::{
44
forge::{build::CoreBuildArgs, install, test::FilterArgs},
5-
Cmd, LoadConfig,
5+
LoadConfig,
66
},
77
utils::{p_println, STATIC_FUZZ_SEED},
88
};
@@ -31,7 +31,7 @@ use foundry_common::{compile::ProjectCompiler, evm::EvmArgs, fs};
3131
use foundry_config::Config;
3232
use foundry_evm::utils::evm_spec;
3333
use semver::Version;
34-
use std::{collections::HashMap, sync::mpsc::channel, thread};
34+
use std::{collections::HashMap, sync::mpsc::channel};
3535
use tracing::trace;
3636

3737
// Loads project's figment and merges the build cli arguments into it
@@ -61,12 +61,8 @@ impl CoverageArgs {
6161
pub fn build_args(&self) -> &CoreBuildArgs {
6262
&self.opts
6363
}
64-
}
65-
66-
impl Cmd for CoverageArgs {
67-
type Output = ();
6864

69-
fn run(self) -> eyre::Result<Self::Output> {
65+
pub async fn run(self) -> eyre::Result<()> {
7066
let (mut config, evm_opts) = self.load_config_and_evm_opts_emit_warnings()?;
7167

7268
// install missing dependencies
@@ -85,7 +81,7 @@ impl Cmd for CoverageArgs {
8581
let report = self.prepare(&config, output.clone())?;
8682

8783
p_println!(!self.opts.silent => "Running tests...");
88-
self.collect(project, output, report, config, evm_opts)
84+
self.collect(project, output, report, config, evm_opts).await
8985
}
9086
}
9187

@@ -255,7 +251,7 @@ impl CoverageArgs {
255251
}
256252

257253
/// Runs tests, collects coverage data and generates the final report.
258-
fn collect(
254+
async fn collect(
259255
self,
260256
project: Project,
261257
output: ProjectCompileOutput,
@@ -267,7 +263,7 @@ impl CoverageArgs {
267263

268264
// Build the contract runner
269265
let evm_spec = evm_spec(&config.evm_version);
270-
let env = evm_opts.evm_env_blocking()?;
266+
let env = evm_opts.evm_env().await;
271267
let mut runner = MultiContractRunnerBuilder::default()
272268
.initial_balance(evm_opts.initial_balance)
273269
.evm_spec(evm_spec)
@@ -280,8 +276,12 @@ impl CoverageArgs {
280276

281277
// Run tests
282278
let known_contracts = runner.known_contracts.clone();
279+
let filter = self.filter;
283280
let (tx, rx) = channel::<(String, SuiteResult)>();
284-
let handle = thread::spawn(move || runner.test(&self.filter, Some(tx), Default::default()));
281+
let handle =
282+
tokio::task::spawn(
283+
async move { runner.test(filter, Some(tx), Default::default()).await },
284+
);
285285

286286
// Add hit data to the coverage report
287287
for (artifact_id, hits) in rx
@@ -313,7 +313,7 @@ impl CoverageArgs {
313313
}
314314

315315
// Reattach the thread
316-
let _ = handle.join();
316+
let _ = handle.await;
317317

318318
// Output final report
319319
for report_kind in self.report {

cli/src/cmd/forge/script/executor.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,8 @@ impl ScriptArgs {
291291
None => {
292292
let backend = Backend::spawn(
293293
script_config.evm_opts.get_fork(&script_config.config, env.clone()),
294-
);
294+
)
295+
.await;
295296
script_config.backends.insert(url.clone(), backend);
296297
script_config.backends.get(url).unwrap().clone()
297298
}
@@ -301,6 +302,7 @@ impl ScriptArgs {
301302
// no need to cache it, since there won't be any onchain simulation that we'd need
302303
// to cache the backend for.
303304
Backend::spawn(script_config.evm_opts.get_fork(&script_config.config, env.clone()))
305+
.await
304306
}
305307
};
306308

cli/src/cmd/forge/snapshot.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
//! Snapshot command
22
use crate::{
3-
cmd::{
4-
forge::{
5-
build::CoreBuildArgs,
6-
test,
7-
test::{Test, TestOutcome},
8-
},
9-
Cmd,
3+
cmd::forge::{
4+
build::CoreBuildArgs,
5+
test,
6+
test::{Test, TestOutcome},
107
},
118
utils::STATIC_FUZZ_SEED,
129
};
@@ -107,16 +104,12 @@ impl SnapshotArgs {
107104
pub fn build_args(&self) -> &CoreBuildArgs {
108105
self.test.build_args()
109106
}
110-
}
111-
112-
impl Cmd for SnapshotArgs {
113-
type Output = ();
114107

115-
fn run(mut self) -> eyre::Result<()> {
108+
pub async fn run(mut self) -> eyre::Result<()> {
116109
// Set fuzz seed so gas snapshots are deterministic
117110
self.test.fuzz_seed = Some(U256::from_big_endian(&STATIC_FUZZ_SEED));
118111

119-
let outcome = self.test.execute_tests()?;
112+
let outcome = self.test.execute_tests().await?;
120113
outcome.ensure_ok()?;
121114
let tests = self.config.apply(outcome);
122115

0 commit comments

Comments
 (0)