summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-30 13:22:50 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-30 14:25:56 +0200
commitdc19f3908644d2d49f0ca97ae60d1d6f825d5dc9 (patch)
tree14121b642070f62e8178c0cbed6204e6503621ad
parent0440d1a4b8953f9cb8a39d5c6f4f549157db41e8 (diff)
downloadrebel-dc19f3908644d2d49f0ca97ae60d1d6f825d5dc9.tar
rebel-dc19f3908644d2d49f0ca97ae60d1d6f825d5dc9.zip
driver: skip submission of empty tasks
-rw-r--r--crates/common/src/types.rs2
-rw-r--r--crates/driver/src/driver.rs22
-rw-r--r--crates/driver/src/task.rs6
3 files changed, 22 insertions, 8 deletions
diff --git a/crates/common/src/types.rs b/crates/common/src/types.rs
index 14d8c16..120630c 100644
--- a/crates/common/src/types.rs
+++ b/crates/common/src/types.rs
@@ -43,7 +43,7 @@ pub struct Task {
pub outputs: HashMap<String, String>,
}
-#[derive(Clone, Debug, Deserialize, Serialize)]
+#[derive(Clone, Debug, Deserialize, Serialize, Default)]
pub struct TaskOutput {
pub input_hash: Option<InputHash>,
pub layer: Option<LayerHash>,
diff --git a/crates/driver/src/driver.rs b/crates/driver/src/driver.rs
index 375c567..bafba1b 100644
--- a/crates/driver/src/driver.rs
+++ b/crates/driver/src/driver.rs
@@ -266,8 +266,12 @@ impl<'ctx> Driver<'ctx> {
}
}
- fn spawn_task(&self, task_ref: &TaskRef<'ctx>, runner: &Runner) -> Result<UnixStream> {
+ fn spawn_task(&self, task_ref: &TaskRef<'ctx>, runner: &Runner) -> Result<Option<UnixStream>> {
let task_def = &self.state.ctx[task_ref.id];
+ if task_def.action.is_empty() {
+ return Ok(None);
+ }
+
let task_deps = self.state.task_deps(task_ref)?;
let task_output = task_def
.output
@@ -302,15 +306,19 @@ impl<'ctx> Driver<'ctx> {
outputs: task_output,
};
- Ok(runner.spawn(&task))
+ Ok(Some(runner.spawn(&task)))
}
fn run_task(&mut self, task_ref: TaskRef<'ctx>, runner: &Runner) -> Result<()> {
- let socket = self.spawn_task(&task_ref, runner)?;
- assert!(self
- .tasks_running
- .insert(socket.as_raw_fd(), (socket, task_ref))
- .is_none());
+ if let Some(socket) = self.spawn_task(&task_ref, runner)? {
+ assert!(self
+ .tasks_running
+ .insert(socket.as_raw_fd(), (socket, task_ref))
+ .is_none());
+ } else {
+ println!("Skipping empty task {:#}", task_ref);
+ self.update_runnable(task_ref, TaskOutput::default());
+ }
Ok(())
}
diff --git a/crates/driver/src/task.rs b/crates/driver/src/task.rs
index fe9572c..6b9083b 100644
--- a/crates/driver/src/task.rs
+++ b/crates/driver/src/task.rs
@@ -63,6 +63,12 @@ pub struct Action {
pub run: String,
}
+impl Action {
+ pub fn is_empty(&self) -> bool {
+ self.run.is_empty()
+ }
+}
+
#[derive(Clone, Debug, Deserialize)]
pub struct TaskDef {
#[serde(skip)]