diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-06-21 23:39:32 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-06-21 23:39:32 +0200 |
commit | bf8c179963aabdbb2b03c6af58cd8249f2820e09 (patch) | |
tree | a6e4896b9fc6cf381efbb218229fa52c0fbad9b7 | |
parent | 5de93d2d034aa5de37704555cd08f4c3c9285f85 (diff) | |
download | rebel-bf8c179963aabdbb2b03c6af58cd8249f2820e09.tar rebel-bf8c179963aabdbb2b03c6af58cd8249f2820e09.zip |
Use input hash for temporary task output filename
-rw-r--r-- | src/executor.rs | 4 | ||||
-rw-r--r-- | src/runner/runc/init.rs | 4 | ||||
-rw-r--r-- | src/runner/runc/run.rs | 6 | ||||
-rw-r--r-- | src/types.rs | 66 |
4 files changed, 48 insertions, 32 deletions
diff --git a/src/executor.rs b/src/executor.rs index 9af0863..3608696 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -1,6 +1,6 @@ use std::collections::{HashMap, HashSet}; -use crate::{runner, types::*, util::cjson}; +use crate::{runner, types::*}; #[derive(Debug)] pub struct Executor<'a> { @@ -73,7 +73,7 @@ impl<'a> Executor<'a> { depends: task_deps, }; - let input_hash = StringHash(cjson::digest::<InputHasher, _>(&task)?.into()); + let input_hash = task.input_hash(); let output_hash = runner.run(&task)?; let output = TaskOutput { diff --git a/src/runner/runc/init.rs b/src/runner/runc/init.rs index f686e3e..f68de47 100644 --- a/src/runner/runc/init.rs +++ b/src/runner/runc/init.rs @@ -52,7 +52,9 @@ impl From<Error> for io::Error { } pub fn runc_preinit() -> Result<(), Error> { - DirBuilder::new().recursive(true).create("build/state")?; + DirBuilder::new() + .recursive(true) + .create("build/state/tmp")?; sched::unshare(CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_NEWNS).to_io_result()?; Ok(()) } diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs index 63c97f2..02a1867 100644 --- a/src/runner/runc/run.rs +++ b/src/runner/runc/run.rs @@ -65,13 +65,13 @@ fn init_task() -> Result<(), Error> { Ok(()) } -fn output_filename(task: &Task) -> PathBuf { - Path::new("build/state").join(format!("{}.tar", task.id)) +fn output_filename(task: &Task) -> Result<PathBuf, io::Error> { + Ok(Path::new("build/state/tmp").join(format!("{}.tar", task.input_hash()))) } fn collect_output(task: Task) -> Result<OutputHash, io::Error> { let file = util::unix::create_as( - output_filename(&task), + output_filename(&task)?, Some(unshare::BUILD_UID), Some(unshare::BUILD_GID), )?; diff --git a/src/types.rs b/src/types.rs index 9a9e2b9..6b6c4ff 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,37 +1,18 @@ use serde::{Deserialize, Serialize}; use sha2::Sha256; -use std::collections::HashMap; +use std::{collections::HashMap, fmt::Display}; -pub type TaskID = String; +use crate::util::cjson; -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TaskDef { - #[serde(default)] - pub depends: Vec<TaskID>, - #[serde(default)] - pub output: Vec<String>, - pub run: String, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Task { - pub id: TaskID, - pub def: TaskDef, - pub depends: HashMap<TaskID, OutputHash>, -} - -#[derive(Debug, Default)] -pub struct TaskMap(pub HashMap<String, TaskDef>); +#[derive(Clone, Copy, Debug)] +pub struct StringHash(pub [u8; 32]); -impl TaskMap { - pub fn get(&self, task: &TaskID) -> Option<&TaskDef> { - self.0.get(task) +impl Display for StringHash { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&hex::encode(self.0)) } } -#[derive(Clone, Copy, Debug)] -pub struct StringHash(pub [u8; 32]); - impl Serialize for StringHash { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where @@ -55,6 +36,39 @@ pub type InputHash = StringHash; pub type OutputHasher = Sha256; pub type OutputHash = StringHash; +pub type TaskID = String; + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct TaskDef { + #[serde(default)] + pub depends: Vec<TaskID>, + #[serde(default)] + pub output: Vec<String>, + pub run: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Task { + pub id: TaskID, + pub def: TaskDef, + pub depends: HashMap<TaskID, OutputHash>, +} + +impl Task { + pub fn input_hash(&self) -> InputHash { + StringHash(cjson::digest::<InputHasher, _>(self).unwrap().into()) + } +} + +#[derive(Debug, Default)] +pub struct TaskMap(pub HashMap<String, TaskDef>); + +impl TaskMap { + pub fn get(&self, task: &TaskID) -> Option<&TaskDef> { + self.0.get(task) + } +} + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct TaskOutput { pub id: TaskID, |