From fddeb158b550a938358ee8251741514b362c68b6 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 30 Oct 2021 10:20:29 +0200 Subject: 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. --- crates/common/src/types.rs | 1 + crates/driver/src/driver.rs | 1 + crates/runner/src/paths.rs | 5 +++++ crates/runner/src/task.rs | 22 +++++++++++++++------- 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, pub depends: HashSet, pub outputs: HashMap, + pub pins: HashMap, } #[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>(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>(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>(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>(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 { @@ -313,7 +321,7 @@ fn unpack_dependencies(input_hash: &InputHash, task: &Task) -> Result )?; } Dependency::Task { output, path } => { - unpack_dependency(paths::archive_filename(output), output)?; + unpack_dependency(task, output)?; ret.entry(path.clone()).or_default().push(*output); } } -- cgit v1.2.3