summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-04-06 23:54:33 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-04-06 23:58:25 +0200
commita466c57611ac645cfe5f3af2ff2f20be2f30f395 (patch)
tree4f9cb034c6cb2acf5d22ae851e7637547d53bb42
parent3dac699970d4adf0ac0ec32b121123cb67108bbd (diff)
downloadrebel-a466c57611ac645cfe5f3af2ff2f20be2f30f395.tar
rebel-a466c57611ac645cfe5f3af2ff2f20be2f30f395.zip
driver: do not kill remaining tasks immediately on failure
-rw-r--r--crates/driver/src/driver.rs48
-rw-r--r--crates/driver/src/main.rs13
2 files changed, 41 insertions, 20 deletions
diff --git a/crates/driver/src/driver.rs b/crates/driver/src/driver.rs
index 58d356b..c401f27 100644
--- a/crates/driver/src/driver.rs
+++ b/crates/driver/src/driver.rs
@@ -351,7 +351,7 @@ impl<'ctx> Driver<'ctx> {
Ok(())
}
- fn wait_for_task(&mut self) -> Result<()> {
+ fn wait_for_task(&mut self) -> Result<bool> {
let mut pollfds: Vec<_> = self
.tasks_running
.values()
@@ -382,31 +382,45 @@ impl<'ctx> Driver<'ctx> {
let (socket, task_ref) = self.tasks_running.remove(&fd).unwrap();
- let task_output = Runner::result(&socket)?;
- self.update_runnable(task_ref, task_output);
+ match Runner::result(&socket) {
+ Ok(task_output) => {
+ self.update_runnable(task_ref, task_output);
+ }
+ Err(error) => {
+ eprintln!("{}", error);
+ return Ok(false);
+ }
+ }
}
- Ok(())
- }
-
- fn is_empty(&self) -> bool {
- self.tasks_runnable.is_empty() && self.tasks_running.is_empty()
+ Ok(true)
}
fn is_done(&self) -> bool {
- self.is_empty() && self.tasks_blocked.is_empty()
+ self.tasks_blocked.is_empty()
+ && self.tasks_runnable.is_empty()
+ && self.tasks_running.is_empty()
}
- pub fn run(&mut self, runner: &Runner) -> Result<()> {
- while !self.is_empty() {
- self.run_tasks(runner)?;
- self.wait_for_task()?;
- }
+ pub fn run(&mut self, runner: &Runner) -> Result<bool> {
+ let mut success = true;
- assert!(self.is_done(), "No runnable tasks left");
+ self.run_tasks(runner)?;
- self.state.print_summary();
+ while !self.tasks_running.is_empty() {
+ if !self.wait_for_task()? {
+ success = false;
+ }
+ if success {
+ self.run_tasks(runner)?;
+ }
+ }
- Ok(())
+ if success {
+ assert!(self.is_done(), "No runnable tasks left");
+ self.state.print_summary();
+ }
+
+ Ok(success)
}
}
diff --git a/crates/driver/src/main.rs b/crates/driver/src/main.rs
index 98aa10a..44e5e1d 100644
--- a/crates/driver/src/main.rs
+++ b/crates/driver/src/main.rs
@@ -62,8 +62,15 @@ fn main() {
}
let taskset = rsv.into_taskset();
let mut driver = driver::Driver::new(&ctx, taskset, force_run).unwrap();
- if let Err(error) = driver.run(&runner) {
- eprintln!("{}", error);
- std::process::exit(1);
+ match driver.run(&runner) {
+ Ok(success) => {
+ if !success {
+ std::process::exit(1);
+ }
+ }
+ Err(error) => {
+ eprintln!("{}", error);
+ std::process::exit(1);
+ }
}
}