Skip to content

Commit 4cc86bb

Browse files
committed
runner: include prepare step in the logs
1 parent 25031f3 commit 4cc86bb

File tree

9 files changed

+98
-22
lines changed

9 files changed

+98
-22
lines changed

src/agent/results.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,13 @@ impl<'a> WriteResults for ResultsUploader<'a> {
4848
_ex: &Experiment,
4949
toolchain: &Toolchain,
5050
krate: &Crate,
51+
existing_logs: Option<LogStorage>,
5152
f: F,
5253
) -> Fallible<TestResult>
5354
where
5455
F: FnOnce() -> Fallible<TestResult>,
5556
{
56-
let storage = LogStorage::new(LevelFilter::Info);
57+
let storage = existing_logs.unwrap_or_else(|| LogStorage::new(LevelFilter::Info));
5758
let result = logs::capture(&storage, f)?;
5859
let output = storage.to_string();
5960

src/logs/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use log::{Log, Metadata, Record};
55
use std::cell::RefCell;
66
use std::thread::LocalKey;
77

8-
pub(crate) use self::storage::LogStorage;
8+
pub use self::storage::LogStorage;
99

1010
thread_local! {
1111
static SCOPED: RefCell<Vec<Box<Log>>> = RefCell::new(Vec::new());

src/logs/storage.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use log::{Level, LevelFilter, Log, Metadata, Record};
22
use std::fmt;
33
use std::sync::{Arc, Mutex};
44

5+
#[derive(Clone)]
56
struct StoredRecord {
67
level: Level,
78
message: String,
@@ -12,7 +13,7 @@ struct InnerStorage {
1213
}
1314

1415
#[derive(Clone)]
15-
pub(crate) struct LogStorage {
16+
pub struct LogStorage {
1617
inner: Arc<Mutex<InnerStorage>>,
1718
min_level: LevelFilter,
1819
}
@@ -26,6 +27,16 @@ impl LogStorage {
2627
min_level,
2728
}
2829
}
30+
31+
pub(crate) fn duplicate(&self) -> LogStorage {
32+
let inner = self.inner.lock().unwrap();
33+
LogStorage {
34+
inner: Arc::new(Mutex::new(InnerStorage {
35+
records: inner.records.clone(),
36+
})),
37+
min_level: self.min_level,
38+
}
39+
}
2940
}
3041

3142
impl Log for LogStorage {

src/results/db.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,13 @@ impl<'a> WriteResults for DatabaseDB<'a> {
168168
ex: &Experiment,
169169
toolchain: &Toolchain,
170170
krate: &Crate,
171+
existing_logs: Option<LogStorage>,
171172
f: F,
172173
) -> Fallible<TestResult>
173174
where
174175
F: FnOnce() -> Fallible<TestResult>,
175176
{
176-
let storage = LogStorage::new(LevelFilter::Info);
177+
let storage = existing_logs.unwrap_or_else(|| LogStorage::new(LevelFilter::Info));
177178
let result = logs::capture(&storage, f)?;
178179
let output = storage.to_string();
179180
self.store_result(ex, krate, toolchain, result, output.as_bytes())?;

src/results/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ mod dummy;
44

55
use crate::crates::{Crate, GitHubRepo};
66
use crate::experiments::Experiment;
7+
use crate::logs::LogStorage;
78
use crate::prelude::*;
89
pub use crate::results::db::{DatabaseDB, ProgressData};
910
#[cfg(test)]
@@ -41,6 +42,7 @@ pub trait WriteResults {
4142
ex: &Experiment,
4243
toolchain: &Toolchain,
4344
krate: &Crate,
45+
existing_logs: Option<LogStorage>,
4446
f: F,
4547
) -> Fallible<TestResult>
4648
where

src/runner/graph.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ use crate::config::Config;
2020
use crate::experiments::{Experiment, Mode};
2121
use crate::prelude::*;
2222
use crate::results::{TestResult, WriteResults};
23-
use crate::runner::tasks::{Task, TaskStep};
23+
use crate::runner::{
24+
tasks::{Task, TaskStep},
25+
RunnerState,
26+
};
2427
use failure::AsFail;
2528
use petgraph::{dot::Dot, graph::NodeIndex, stable_graph::StableDiGraph, Direction};
2629
use std::fmt::{self, Debug};
@@ -187,6 +190,7 @@ impl TasksGraph {
187190
node: NodeIndex,
188191
ex: &Experiment,
189192
db: &DB,
193+
state: &RunnerState,
190194
error: &F,
191195
result: TestResult,
192196
) -> Fallible<()> {
@@ -195,11 +199,11 @@ impl TasksGraph {
195199
.neighbors_directed(node, Direction::Incoming)
196200
.collect::<Vec<_>>();
197201
for child in children.drain(..) {
198-
self.mark_as_failed(child, ex, db, error, result)?;
202+
self.mark_as_failed(child, ex, db, state, error, result)?;
199203
}
200204

201205
match self.graph[node] {
202-
Node::Task { ref task, .. } => task.mark_as_failed(ex, db, error, result)?,
206+
Node::Task { ref task, .. } => task.mark_as_failed(ex, db, state, error, result)?,
203207
Node::CrateCompleted | Node::Root => return Ok(()),
204208
}
205209

src/runner/mod.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ mod toml_frobber;
66
mod unstable_features;
77

88
use crate::config::Config;
9+
use crate::crates::Crate;
910
use crate::docker::DockerEnv;
1011
use crate::experiments::Experiment;
12+
use crate::logs::LogStorage;
1113
use crate::prelude::*;
1214
use crate::results::{FailureReason, TestResult, WriteResults};
1315
use crate::runner::graph::{build_graph, WalkResult};
@@ -22,6 +24,28 @@ use std::thread;
2224
#[fail(display = "overridden task result to {}", _0)]
2325
pub struct OverrideResult(TestResult);
2426

27+
struct RunnerStateInner {
28+
prepare_logs: HashMap<Crate, LogStorage>,
29+
}
30+
31+
struct RunnerState {
32+
inner: Mutex<RunnerStateInner>,
33+
}
34+
35+
impl RunnerState {
36+
fn new() -> Self {
37+
RunnerState {
38+
inner: Mutex::new(RunnerStateInner {
39+
prepare_logs: HashMap::new(),
40+
}),
41+
}
42+
}
43+
44+
fn lock(&self) -> std::sync::MutexGuard<RunnerStateInner> {
45+
self.inner.lock().unwrap()
46+
}
47+
}
48+
2549
pub fn run_ex<DB: WriteResults + Sync>(
2650
ex: &Experiment,
2751
db: &DB,
@@ -70,6 +94,7 @@ fn run_ex_inner<DB: WriteResults + Sync>(
7094
// An HashMap is used instead of an HashSet because Thread is not Eq+Hash
7195
let parked_threads: Mutex<HashMap<thread::ThreadId, thread::Thread>> =
7296
Mutex::new(HashMap::new());
97+
let state = RunnerState::new();
7398

7499
scope(|scope| -> Fallible<()> {
75100
let mut threads = Vec::new();
@@ -83,7 +108,7 @@ fn run_ex_inner<DB: WriteResults + Sync>(
83108
match walk_result {
84109
WalkResult::Task(id, task) => {
85110
info!("running task: {:?}", task);
86-
if let Err(e) = task.run(config, ex, db, &docker_env) {
111+
if let Err(e) = task.run(config, ex, db, &docker_env, &state) {
87112
error!("task failed, marking childs as failed too: {:?}", task);
88113
utils::report_failure(&e);
89114

@@ -103,7 +128,7 @@ fn run_ex_inner<DB: WriteResults + Sync>(
103128
graph
104129
.lock()
105130
.unwrap()
106-
.mark_as_failed(id, ex, db, &e, result)?;
131+
.mark_as_failed(id, ex, db, &state, &e, result)?;
107132
} else {
108133
graph.lock().unwrap().mark_as_completed(id);
109134
}

src/runner/tasks.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ use crate::crates::Crate;
33
use crate::dirs;
44
use crate::docker::DockerEnv;
55
use crate::experiments::Experiment;
6+
use crate::logs::{self, LogStorage};
67
use crate::prelude::*;
78
use crate::results::{TestResult, WriteResults};
8-
use crate::runner::prepare::PrepareCrate;
9-
use crate::runner::test;
9+
use crate::runner::{prepare::PrepareCrate, test, RunnerState};
1010
use crate::toolchain::Toolchain;
1111
use crate::utils;
1212
use failure::AsFail;
13+
use log::LevelFilter;
1314
use std::fmt;
1415

1516
pub(super) struct TaskCtx<'ctx, DB: WriteResults + 'ctx> {
@@ -19,17 +20,20 @@ pub(super) struct TaskCtx<'ctx, DB: WriteResults + 'ctx> {
1920
pub(super) toolchain: &'ctx Toolchain,
2021
pub(super) krate: &'ctx Crate,
2122
pub(super) docker_env: &'ctx DockerEnv,
23+
pub(super) state: &'ctx RunnerState,
2224
pub(super) quiet: bool,
2325
}
2426

2527
impl<'ctx, DB: WriteResults + 'ctx> TaskCtx<'ctx, DB> {
28+
#[allow(clippy::too_many_arguments)]
2629
fn new(
2730
config: &'ctx Config,
2831
db: &'ctx DB,
2932
experiment: &'ctx Experiment,
3033
toolchain: &'ctx Toolchain,
3134
krate: &'ctx Crate,
3235
docker_env: &'ctx DockerEnv,
36+
state: &'ctx RunnerState,
3337
quiet: bool,
3438
) -> Self {
3539
TaskCtx {
@@ -39,6 +43,7 @@ impl<'ctx, DB: WriteResults + 'ctx> TaskCtx<'ctx, DB> {
3943
toolchain,
4044
krate,
4145
docker_env,
46+
state,
4247
quiet,
4348
}
4449
}
@@ -127,6 +132,7 @@ impl Task {
127132
&self,
128133
ex: &Experiment,
129134
db: &DB,
135+
state: &RunnerState,
130136
err: &F,
131137
result: TestResult,
132138
) -> Fallible<()> {
@@ -137,7 +143,12 @@ impl Task {
137143
| TaskStep::CheckOnly { ref tc, .. }
138144
| TaskStep::Rustdoc { ref tc, .. }
139145
| TaskStep::UnstableFeatures { ref tc } => {
140-
db.record_result(ex, tc, &self.krate, || {
146+
let log_storage = state
147+
.lock()
148+
.prepare_logs
149+
.get(&self.krate)
150+
.map(|s| s.duplicate());
151+
db.record_result(ex, tc, &self.krate, log_storage, || {
141152
error!("this task or one of its parent failed!");
142153
utils::report_failure(err);
143154
Ok(result)
@@ -154,36 +165,46 @@ impl Task {
154165
ex: &Experiment,
155166
db: &DB,
156167
docker_env: &DockerEnv,
168+
state: &RunnerState,
157169
) -> Fallible<()> {
158170
match self.step {
159171
TaskStep::Cleanup => {
160172
// Ensure source directories are cleaned up
161173
for tc in &ex.toolchains {
162174
let _ = utils::fs::remove_dir_all(&dirs::crate_source_dir(ex, tc, &self.krate));
163175
}
176+
// Remove stored logs
177+
state.lock().prepare_logs.remove(&self.krate);
164178
}
165179
TaskStep::Prepare => {
166-
let prepare = PrepareCrate::new(ex, &self.krate, config, db);
167-
prepare.prepare()?;
180+
let storage = LogStorage::new(LevelFilter::Info);
181+
state
182+
.lock()
183+
.prepare_logs
184+
.insert(self.krate.clone(), storage.clone());
185+
logs::capture(&storage, || {
186+
let prepare = PrepareCrate::new(ex, &self.krate, config, db);
187+
prepare.prepare()
188+
})?;
168189
}
169190
TaskStep::BuildAndTest { ref tc, quiet } => {
170-
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, quiet);
191+
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, state, quiet);
171192
test::run_test("testing", &ctx, test::test_build_and_test)?;
172193
}
173194
TaskStep::BuildOnly { ref tc, quiet } => {
174-
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, quiet);
195+
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, state, quiet);
175196
test::run_test("building", &ctx, test::test_build_only)?;
176197
}
177198
TaskStep::CheckOnly { ref tc, quiet } => {
178-
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, quiet);
199+
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, state, quiet);
179200
test::run_test("checking", &ctx, test::test_check_only)?;
180201
}
181202
TaskStep::Rustdoc { ref tc, quiet } => {
182-
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, quiet);
203+
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, state, quiet);
183204
test::run_test("documenting", &ctx, test::test_rustdoc)?;
184205
}
185206
TaskStep::UnstableFeatures { ref tc } => {
186-
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, false);
207+
let ctx = TaskCtx::new(config, db, ex, tc, &self.krate, docker_env, state, false);
187208
test::run_test(
188209
"checking unstable",
189210
&ctx,

src/runner/test.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,18 @@ pub(super) fn run_test<DB: WriteResults>(
7070
info!("skipping crate {}. existing result: {}", ctx.krate, res);
7171
} else {
7272
let source_path = crate::dirs::crate_source_dir(ctx.experiment, ctx.toolchain, ctx.krate);
73-
ctx.db
74-
.record_result(ctx.experiment, ctx.toolchain, ctx.krate, || {
73+
let log_storage = ctx
74+
.state
75+
.lock()
76+
.prepare_logs
77+
.get(&ctx.krate)
78+
.map(|s| s.duplicate());
79+
ctx.db.record_result(
80+
ctx.experiment,
81+
ctx.toolchain,
82+
ctx.krate,
83+
log_storage,
84+
|| {
7585
info!(
7686
"{} {} against {} for {}",
7787
action,
@@ -80,7 +90,8 @@ pub(super) fn run_test<DB: WriteResults>(
8090
ctx.experiment.name
8191
);
8292
test_fn(ctx, &source_path)
83-
})?;
93+
},
94+
)?;
8495
}
8596
Ok(())
8697
}

0 commit comments

Comments
 (0)