From ac59d9359ddc1e9bcc15240a5d26833c12d86f5e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 17 Nov 2021 01:21:10 +0100 Subject: runner: handle force_run flag, warn if output hash does not match --- crates/runner/src/task.rs | 18 ++++++++++++++++-- crates/runner/src/util/cjson.rs | 6 ++++++ 2 files changed, 22 insertions(+), 2 deletions(-) (limited to 'crates') diff --git a/crates/runner/src/task.rs b/crates/runner/src/task.rs index 8981d13..19a7484 100644 --- a/crates/runner/src/task.rs +++ b/crates/runner/src/task.rs @@ -575,8 +575,11 @@ pub fn handle(task: Task, jobserver: &mut Jobserver) -> Result { let _lock = unix::lock(paths::task_lock_filename(&input_hash), true, true) .context("Failed to get task lock")?; - if let Ok(task_output) = load_cached(&input_hash) { - return Ok(task_output); + let cached_output = load_cached(&input_hash); + if !task.force_run { + if let Ok(task_output) = cached_output { + return Ok(task_output); + } } let token = jobserver.wait(); @@ -602,5 +605,16 @@ pub fn handle(task: Task, jobserver: &mut Jobserver) -> Result { duration.as_secs_f32() ); + if let Ok(cached_output) = cached_output { + if cached_output.outputs != task_output.outputs { + println!( + "WARNING: Output hashes for task {} do not match cached result\n Cached output: {}\n New output: {}", + task.label, + cjson::to_string(&cached_output.outputs).unwrap(), + cjson::to_string(&task_output.outputs).unwrap(), + ); + } + } + Ok(task_output) } diff --git a/crates/runner/src/util/cjson.rs b/crates/runner/src/util/cjson.rs index 5990943..e3840ce 100644 --- a/crates/runner/src/util/cjson.rs +++ b/crates/runner/src/util/cjson.rs @@ -24,6 +24,12 @@ pub fn to_file, T: ?Sized + Serialize>(path: P, value: &T) -> io: file.sync_all() } +pub fn to_string(value: &T) -> Result { + let mut ret = Vec::new(); + to_writer(&mut ret, value)?; + Ok(String::from_utf8(ret).unwrap()) +} + pub fn digest(value: &T) -> Result> { let mut digest = ::new(); to_writer(&mut digest, value)?; -- cgit v1.2.3