diff options
author | Peter Kolloch <info@eigenvalue.net> | 2024-02-21T11·24+0700 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2024-02-21T11·34+0000 |
commit | c06fb01b3b7a752e0c04ba21a02cdc3f431055e1 (patch) | |
tree | c8fea42621edcaba6222373e2c4d9582f30be25b /tvix/nix-compat/src/derivation/mod.rs | |
parent | a44a8985cc0ae126f86d26493d97d80a09b211f8 (diff) |
feat(tvix/nix-compat): input_derivations with StorePaths r/7583
...in `Derivation`. This is more type-safe and should consume less memory. This also removes some allocations in the potentially hot path of output hash calculation. https: //b.tvl.fyi/issues/264 Change-Id: I6ad7d3cb868dc9f750894d449a6065608ef06e8c Reviewed-on: https://cl.tvl.fyi/c/depot/+/10957 Tested-by: BuildkiteCI Reviewed-by: flokli <flokli@flokli.de> Autosubmit: Peter Kolloch <info@eigenvalue.net> Reviewed-by: Peter Kolloch <info@eigenvalue.net>
Diffstat (limited to 'tvix/nix-compat/src/derivation/mod.rs')
-rw-r--r-- | tvix/nix-compat/src/derivation/mod.rs | 31 |
1 files changed, 9 insertions, 22 deletions
diff --git a/tvix/nix-compat/src/derivation/mod.rs b/tvix/nix-compat/src/derivation/mod.rs index 3a09c9d56632..3cf9a5ba7f22 100644 --- a/tvix/nix-compat/src/derivation/mod.rs +++ b/tvix/nix-compat/src/derivation/mod.rs @@ -36,7 +36,7 @@ pub struct Derivation { /// Map from drv path to output names used from this derivation. #[serde(rename = "inputDrvs")] - pub input_derivations: BTreeMap<String, BTreeSet<String>>, + pub input_derivations: BTreeMap<StorePath, BTreeSet<String>>, /// Plain store paths of additional inputs. #[serde(rename = "inputSrcs")] @@ -70,19 +70,7 @@ impl Derivation { write_outputs(writer, &self.outputs)?; write_char(writer, COMMA)?; - // To reproduce the exact hashes of original nix, we need to sort - // these by their aterm representation. - // StorePath has a different sort order, so we convert it here. - let input_derivations: BTreeMap<BString, &BTreeSet<String>> = input_derivations - .iter() - .map(|(k, v)| { - let mut aterm_k = Vec::new(); - k.aterm_write(&mut aterm_k).expect("no write error to Vec"); - (BString::new(aterm_k), v) - }) - .collect(); - - write_input_derivations(writer, &input_derivations)?; + write_input_derivations(writer, input_derivations)?; write_char(writer, COMMA)?; write_input_sources(writer, &self.input_sources)?; @@ -145,8 +133,11 @@ impl Derivation { // into a (sorted, guaranteed by BTreeSet) list of references let references: BTreeSet<String> = { let mut inputs = self.input_sources.clone(); - let input_derivation_keys: Vec<String> = - self.input_derivations.keys().cloned().collect(); + let input_derivation_keys: Vec<String> = self + .input_derivations + .keys() + .map(|k| k.to_absolute_path()) + .collect(); inputs.extend(input_derivation_keys); inputs }; @@ -211,12 +202,8 @@ impl Derivation { // derivation_or_fod_hash, and replace the derivation path with // it's HEXLOWER digest. let input_derivations = BTreeMap::from_iter(self.input_derivations.iter().map( - |(drv_path_str, output_names)| { - // parse drv_path to StorePathRef - let drv_path = StorePathRef::from_absolute_path(drv_path_str.as_bytes()) - .expect("invalid input derivation path"); - - let hash = fn_get_derivation_or_fod_hash(&drv_path); + |(drv_path, output_names)| { + let hash = fn_get_derivation_or_fod_hash(&drv_path.into()); (hash, output_names.to_owned()) }, |