summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/executor.rs2
-rw-r--r--src/runner.rs2
-rw-r--r--src/runner/runc.rs23
-rw-r--r--src/runner/runc/run.rs16
-rw-r--r--src/types.rs4
5 files changed, 22 insertions, 25 deletions
diff --git a/src/executor.rs b/src/executor.rs
index 1340f83..c616c0b 100644
--- a/src/executor.rs
+++ b/src/executor.rs
@@ -50,7 +50,7 @@ impl<'a> Executor<'a> {
fn run_one(&mut self, runner: &impl runner::Runner) -> runner::Result<()> {
let task = self.tasks_runnable.pop().expect("No runnable tasks left");
- runner.run(self.tasks, &task)?;
+ let _hash = runner.run(self.tasks, &task)?;
let rdeps = self.rdeps.get(&task);
diff --git a/src/runner.rs b/src/runner.rs
index 810586c..ebad475 100644
--- a/src/runner.rs
+++ b/src/runner.rs
@@ -7,5 +7,5 @@ use crate::types::*;
pub type Result<T> = io::Result<T>;
pub trait Runner {
- fn run(&self, tasks: &TaskMap, task: &TaskRef) -> Result<()>;
+ fn run(&self, tasks: &TaskMap, task: &TaskRef) -> Result<OutputHash>;
}
diff --git a/src/runner/runc.rs b/src/runner/runc.rs
index 0964ee9..ae61013 100644
--- a/src/runner/runc.rs
+++ b/src/runner/runc.rs
@@ -7,16 +7,17 @@ use std::{io, process};
use ipc_channel::ipc;
use nix::{sys::signal, unistd};
use serde::{Deserialize, Serialize};
-use sha2::Sha256;
use crate::types::*;
use crate::unshare;
use crate::util::ipc::CheckDisconnect;
-pub type OutputHash = Sha256;
-
#[derive(Debug, Deserialize, Serialize)]
-struct Request(TaskRef, Task, ipc::IpcSender<run::Error>);
+struct Request(
+ TaskRef,
+ Task,
+ ipc::IpcSender<Result<OutputHash, run::Error>>,
+);
fn runner(
idmap_finished: ipc::IpcReceiver<()>,
@@ -52,9 +53,8 @@ fn runner(
.unwrap();
let Request(task, task_def, reply_sender) = request;
- if let Err(error) = run::handle_task(task, task_def) {
- reply_sender.send(error).expect("IPC send() failed");
- }
+ let result = run::handle_task(task, task_def);
+ reply_sender.send(result).expect("IPC send() failed");
}
}
}
@@ -106,7 +106,7 @@ impl RuncRunner {
}
impl super::Runner for RuncRunner {
- fn run(&self, tasks: &TaskMap, task: &TaskRef) -> super::Result<()> {
+ fn run(&self, tasks: &TaskMap, task: &TaskRef) -> super::Result<OutputHash> {
let task_def = tasks.get(task).expect("Invalid TaskRef");
let (reply_tx, reply_rx) = ipc::channel().expect("IPC channel creation failed");
@@ -114,11 +114,6 @@ impl super::Runner for RuncRunner {
.send(Request(task.clone(), task_def.clone(), reply_tx))
.expect("RuncRunner task submission failed");
- reply_rx
- .recv()
- .check_disconnect()
- .expect("IPC recv() error")?;
-
- Ok(())
+ Ok(reply_rx.recv().expect("IPC recv() error")?)
}
}
diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs
index 14149d2..dc62159 100644
--- a/src/runner/runc/run.rs
+++ b/src/runner/runc/run.rs
@@ -11,7 +11,7 @@ use nix::{
unistd,
};
use serde::{Deserialize, Serialize};
-use sha2::{digest, Digest};
+use sha2::Digest;
use tee_readwrite::TeeWriter;
use crate::{
@@ -20,7 +20,7 @@ use crate::{
util::{self, ToIOResult},
};
-use super::{spec, OutputHash};
+use super::spec;
#[derive(Debug, Deserialize, Serialize)]
pub enum Error {
@@ -69,13 +69,13 @@ fn output_filename(task: TaskRef) -> PathBuf {
Path::new("build/state").join(format!("{}.tar", task))
}
-fn collect_output(task: TaskRef, task_def: Task) -> Result<digest::Output<OutputHash>, io::Error> {
+fn collect_output(task: TaskRef, task_def: Task) -> Result<OutputHash, io::Error> {
let file = util::unix::create_as(
output_filename(task),
Some(unshare::BUILD_UID),
Some(unshare::BUILD_GID),
)?;
- let hasher = OutputHash::default();
+ let hasher = OutputHasher::default();
let writer = TeeWriter::new(file, hasher);
let writer = util::tar::pack(writer, "build/tmp/runc/workdir", task_def.output.iter())?;
@@ -83,10 +83,10 @@ fn collect_output(task: TaskRef, task_def: Task) -> Result<digest::Output<Output
file.sync_all()?;
- Ok(hasher.finalize())
+ Ok(hasher.finalize().into())
}
-pub fn handle_task(task: TaskRef, task_def: Task) -> Result<(), Error> {
+pub fn handle_task(task: TaskRef, task_def: Task) -> Result<OutputHash, Error> {
init_task()?;
spec::generate_spec(task_def.run.as_str())
@@ -116,7 +116,5 @@ pub fn handle_task(task: TaskRef, task_def: Task) -> Result<(), Error> {
String::from_utf8_lossy(output.stdout.as_slice()),
);
- collect_output(task, task_def)?;
-
- Ok(())
+ Ok(collect_output(task, task_def)?)
}
diff --git a/src/types.rs b/src/types.rs
index 331b49a..afee0e3 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -1,4 +1,5 @@
use serde::{Deserialize, Serialize};
+use sha2::Sha256;
use std::collections::HashMap;
pub type TaskRef = String;
@@ -20,3 +21,6 @@ impl TaskMap {
self.0.get(task)
}
}
+
+pub type OutputHasher = Sha256;
+pub type OutputHash = [u8; 32];