summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-06-21 23:39:32 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-06-21 23:39:32 +0200
commitbf8c179963aabdbb2b03c6af58cd8249f2820e09 (patch)
treea6e4896b9fc6cf381efbb218229fa52c0fbad9b7
parent5de93d2d034aa5de37704555cd08f4c3c9285f85 (diff)
downloadrebel-bf8c179963aabdbb2b03c6af58cd8249f2820e09.tar
rebel-bf8c179963aabdbb2b03c6af58cd8249f2820e09.zip
Use input hash for temporary task output filename
-rw-r--r--src/executor.rs4
-rw-r--r--src/runner/runc/init.rs4
-rw-r--r--src/runner/runc/run.rs6
-rw-r--r--src/types.rs66
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,