Skip to content

Commit 08c425e

Browse files
committed
fixup: use env file
1 parent bb8212a commit 08c425e

3 files changed

Lines changed: 40 additions & 23 deletions

File tree

src/run/runner/helpers/env.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,12 @@ pub fn get_base_injected_env(
1717
),
1818
])
1919
}
20+
21+
pub fn is_codspeed_debug_enabled() -> bool {
22+
let log_level = std::env::var("CODSPEED_LOG")
23+
.ok()
24+
.and_then(|log_level| log_level.parse::<log::LevelFilter>().ok())
25+
.unwrap_or(log::LevelFilter::Info);
26+
27+
log_level < log::LevelFilter::Debug
28+
}

src/run/runner/wall_time/executor.rs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ use crate::prelude::*;
33
use crate::run::RunnerMode;
44
use crate::run::instruments::mongo_tracer::MongoTracer;
55
use crate::run::runner::executor::Executor;
6-
use crate::run::runner::helpers::env::get_base_injected_env;
6+
use crate::run::runner::helpers::env::{get_base_injected_env, is_codspeed_debug_enabled};
77
use crate::run::runner::helpers::get_bench_command::get_bench_command;
88
use crate::run::runner::helpers::run_command_with_log_pipe::run_command_with_log_pipe;
99
use crate::run::runner::{ExecutorName, RunData};
1010
use crate::run::{check_system::SystemInfo, config::Config};
1111
use async_trait::async_trait;
1212
use std::fs::canonicalize;
1313
use std::process::Command;
14+
use tempfile::NamedTempFile;
1415

1516
pub struct WallTimeExecutor {
1617
perf: Option<PerfRunner>,
@@ -23,24 +24,37 @@ impl WallTimeExecutor {
2324
}
2425
}
2526

26-
fn walltime_bench_cmd(config: &Config, run_data: &RunData) -> Result<String> {
27+
fn walltime_bench_cmd(config: &Config, run_data: &RunData) -> Result<(NamedTempFile, String)> {
2728
let bench_cmd = get_bench_command(config)?;
2829

29-
// We have to forward all the environment variables.
3030
let system_env = std::env::vars()
31-
.map(|(env, value)| format!("--setenv={env}=\'{}\'", value.replace("'", "\"")))
32-
.join(" ");
31+
.map(|(env, value)| format!("{env}={value}"))
32+
.join("\n");
3333

34-
let setenv = get_base_injected_env(RunnerMode::Walltime, &run_data.profile_folder)
34+
let base_env = get_base_injected_env(RunnerMode::Walltime, &run_data.profile_folder)
3535
.into_iter()
36-
.map(|(env, value)| format!("--setenv={env}={value}"))
37-
.join(" ");
36+
.map(|(env, value)| format!("{env}={value}"))
37+
.join("\n");
38+
39+
// Store the environment variables in a file which we forward to the command.
40+
let env_file = NamedTempFile::new()?;
41+
std::fs::write(&env_file, format!("{system_env}\n{base_env}"))?;
42+
3843
let uid = nix::unistd::Uid::current().as_raw();
3944
let gid = nix::unistd::Gid::current().as_raw();
40-
Ok(format!(
41-
"systemd-run --scope --slice=codspeed.slice --same-dir --uid={uid} --gid={gid} {system_env} {setenv} -- sh -c '{}'",
45+
46+
let quiet_flag = if is_codspeed_debug_enabled() {
47+
"--quiet"
48+
} else {
49+
""
50+
};
51+
52+
let cmd = format!(
53+
"systemd-run {quiet_flag} --pipe --collect --wait --slice=codspeed.slice --same-dir --uid={uid} --gid={gid} --property=EnvironmentFile={} -- sh -c '{}'",
54+
env_file.path().display(),
4255
bench_cmd.replace("'", "\"")
43-
))
56+
);
57+
Ok((env_file, cmd))
4458
}
4559
}
4660

@@ -72,7 +86,7 @@ impl Executor for WallTimeExecutor {
7286
cmd.current_dir(abs_cwd);
7387
}
7488

75-
let bench_cmd = Self::walltime_bench_cmd(config, run_data)?;
89+
let (_env_file, bench_cmd) = Self::walltime_bench_cmd(config, run_data)?;
7690

7791
let status = if let Some(perf) = &self.perf
7892
&& config.enable_perf

src/run/runner/wall_time/perf/mod.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use crate::prelude::*;
44
use crate::run::UnwindingMode;
55
use crate::run::config::Config;
6+
use crate::run::runner::helpers::env::is_codspeed_debug_enabled;
67
use crate::run::runner::helpers::run_command_with_log_pipe::run_command_with_log_pipe_and_callback;
78
use crate::run::runner::helpers::setup::run_with_sudo;
89
use crate::run::runner::valgrind::helpers::ignored_objects_path::get_objects_path_to_ignore;
@@ -157,17 +158,10 @@ impl PerfRunner {
157158
};
158159
debug!("Using call graph mode: {cg_mode:?}");
159160

160-
let quiet_flag = {
161-
let log_level = std::env::var("CODSPEED_LOG")
162-
.ok()
163-
.and_then(|log_level| log_level.parse::<log::LevelFilter>().ok())
164-
.unwrap_or(log::LevelFilter::Info);
165-
166-
if log_level < log::LevelFilter::Debug {
167-
"--quiet"
168-
} else {
169-
""
170-
}
161+
let quiet_flag = if is_codspeed_debug_enabled() {
162+
"--quiet"
163+
} else {
164+
""
171165
};
172166

173167
cmd.args([

0 commit comments

Comments
 (0)