diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-06-20 15:15:18 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-06-20 16:57:51 +0200 |
commit | 79a60833a6f7c856818afc0b0ef7a51bbf158072 (patch) | |
tree | b65d00a02079ec2a8354170dab1469a6ca2d5c1f | |
parent | be9a8479aaf63794e450e885165842704bf70bf1 (diff) | |
download | rebel-79a60833a6f7c856818afc0b0ef7a51bbf158072.tar rebel-79a60833a6f7c856818afc0b0ef7a51bbf158072.zip |
runc: pass hash back to executor
-rw-r--r-- | src/executor.rs | 2 | ||||
-rw-r--r-- | src/runner.rs | 2 | ||||
-rw-r--r-- | src/runner/runc.rs | 23 | ||||
-rw-r--r-- | src/runner/runc/run.rs | 16 | ||||
-rw-r--r-- | src/types.rs | 4 |
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]; |