summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-30 10:20:29 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-11-01 19:01:09 +0100
commitfddeb158b550a938358ee8251741514b362c68b6 (patch)
treec4dfe6f1500dd3ad159c3f45b7e975e5d5b03dd4
parent7a0bf8027b93e7e3f4e6887c0d116f471629cacd (diff)
downloadrebel-fddeb158b550a938358ee8251741514b362c68b6.tar
rebel-fddeb158b550a938358ee8251741514b362c68b6.zip
runner: allow passing a map of pins with a task submission
Pins allow to use fixed versions of dependencies. They are stored separately from regular dependency archives.
-rw-r--r--crates/common/src/types.rs1
-rw-r--r--crates/driver/src/driver.rs1
-rw-r--r--crates/runner/src/paths.rs5
-rw-r--r--crates/runner/src/task.rs22
4 files changed, 22 insertions, 7 deletions
diff --git a/crates/common/src/types.rs b/crates/common/src/types.rs
index 120630c..336b131 100644
--- a/crates/common/src/types.rs
+++ b/crates/common/src/types.rs
@@ -41,6 +41,7 @@ pub struct Task {
pub inherit: Vec<LayerHash>,
pub depends: HashSet<Dependency>,
pub outputs: HashMap<String, String>,
+ pub pins: HashMap<ArchiveHash, String>,
}
#[derive(Clone, Debug, Deserialize, Serialize, Default)]
diff --git a/crates/driver/src/driver.rs b/crates/driver/src/driver.rs
index fe69ee0..e3dc407 100644
--- a/crates/driver/src/driver.rs
+++ b/crates/driver/src/driver.rs
@@ -305,6 +305,7 @@ impl<'ctx> Driver<'ctx> {
inherit: inherit_chain,
depends: task_deps,
outputs: task_output,
+ pins: HashMap::new(),
};
Ok(Some(runner.spawn(&task)))
diff --git a/crates/runner/src/paths.rs b/crates/runner/src/paths.rs
index 2e174df..b46d1bb 100644
--- a/crates/runner/src/paths.rs
+++ b/crates/runner/src/paths.rs
@@ -43,6 +43,7 @@ use common::string_hash::*;
pub const ROOTFS_ARCHIVE: &str = "build/rootfs.tar";
pub const DOWNLOADS_DIR: &str = "build/downloads";
+pub const PIN_DIR: &str = "build/pinned";
pub const TMP_DIR: &str = "build/tmp";
pub const DEV_DIR: &str = "build/tmp/dev";
@@ -116,3 +117,7 @@ pub fn archive_tmp_filename(hash: &InputHash) -> String {
pub fn archive_filename(hash: &ArchiveHash) -> String {
join(&[OUTPUT_STATE_DIR, &format!("{}.tar", hash)])
}
+
+pub fn pinned_archive_filename(name: &str) -> String {
+ join(&[PIN_DIR, &format!("{}.tar", name)])
+}
diff --git a/crates/runner/src/task.rs b/crates/runner/src/task.rs
index 174768c..c43fc2f 100644
--- a/crates/runner/src/task.rs
+++ b/crates/runner/src/task.rs
@@ -252,9 +252,19 @@ fn cleanup_task(input_hash: &InputHash) -> Result<()> {
Ok(())
}
-fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result<()> {
+fn get_archive_filename(task: &Task, hash: &ArchiveHash) -> String {
+ if let Some(pinned_name) = task.pins.get(hash) {
+ paths::pinned_archive_filename(pinned_name)
+ } else {
+ paths::archive_filename(hash)
+ }
+}
+
+fn unpack_dependency(task: &Task, hash: &ArchiveHash) -> Result<()> {
let _lock = unix::lock(paths::depend_lock_filename(hash), true, true);
+ let filename = get_archive_filename(task, hash);
+
let dest = paths::depend_dir(hash);
if Path::new(&dest).is_dir() {
return Ok(());
@@ -264,7 +274,7 @@ fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result<
let tmp_dest = paths::depend_tmp_dir(hash);
fs::ensure_removed(&tmp_dest)?;
- let file = fs::open(filename.as_ref())?;
+ let file = fs::open(&filename)?;
let hasher = ArchiveHasher::new();
let buffered_hasher = BufWriter::with_capacity(16 * 1024 * 1024, hasher);
let mut reader = TeeReader::new(file, buffered_hasher, false);
@@ -282,9 +292,7 @@ fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result<
if &actual_hash != hash {
return Err(Error::new(format!(
"Incorrect file hash for {:?} (expected: {}, actual: {})",
- filename.as_ref(),
- hash,
- actual_hash
+ filename, hash, actual_hash,
)));
}
@@ -292,7 +300,7 @@ fn unpack_dependency<P: AsRef<Path>>(filename: P, hash: &ArchiveHash) -> Result<
Ok(())
})()
- .with_context(|| format!("Failed to unpack {:?}", filename.as_ref(),))
+ .with_context(|| format!("Failed to unpack {:?}", filename))
}
fn unpack_dependencies(input_hash: &InputHash, task: &Task) -> Result<DependMap> {
@@ -313,7 +321,7 @@ fn unpack_dependencies(input_hash: &InputHash, task: &Task) -> Result<DependMap>
)?;
}
Dependency::Task { output, path } => {
- unpack_dependency(paths::archive_filename(output), output)?;
+ unpack_dependency(task, output)?;
ret.entry(path.clone()).or_default().push(*output);
}
}