feat(tvix/nix-compat): input_derivations with StorePaths

...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>
This commit is contained in:
Peter Kolloch 2024-02-21 18:24:50 +07:00 committed by clbot
parent a44a8985cc
commit c06fb01b3b
9 changed files with 138 additions and 73 deletions

View file

@ -4,6 +4,7 @@ use crate::tvix_store_io::TvixStoreIO;
use bstr::BString;
use nix_compat::derivation::{Derivation, Output};
use nix_compat::nixhash;
use nix_compat::store_path::StorePath;
use std::collections::{btree_map, BTreeSet};
use std::rc::Rc;
use tvix_eval::builtin_macros::builtins;
@ -26,7 +27,23 @@ fn populate_inputs(drv: &mut Derivation, full_context: NixContext) {
drv.input_sources.insert(source.clone());
}
NixContextElement::Single { name, derivation } => {
NixContextElement::Single {
name,
derivation: derivation_str,
} => {
// TODO: b/264
// We assume derivations to be passed validated, so ignoring rest
// and expecting parsing is ok.
let (derivation, _rest) =
StorePath::from_absolute_path_full(derivation_str).expect("valid store path");
#[cfg(debug_assertions)]
assert!(
_rest.iter().next().is_none(),
"Extra path not empty for {}",
derivation_str
);
match drv.input_derivations.entry(derivation.clone()) {
btree_map::Entry::Vacant(entry) => {
entry.insert(BTreeSet::from([name.clone()]));

View file

@ -59,14 +59,8 @@ impl KnownPaths {
// check input derivations to have been inserted.
#[cfg(debug_assertions)]
{
// TODO: b/264
// We assume derivations to be passed validated, so ignoring rest
// and expecting parsing is ok.
for input_drv_path_str in drv.input_derivations.keys() {
let (input_drv_path, _rest) =
StorePath::from_absolute_path_full(input_drv_path_str)
.expect("parse input drv path");
debug_assert!(self.derivations.contains_key(&input_drv_path));
for input_drv_path in drv.input_derivations.keys() {
debug_assert!(self.derivations.contains_key(input_drv_path));
}
}

View file

@ -140,17 +140,11 @@ impl TvixStoreIO {
let input_nodes: BTreeSet<Node> =
futures::stream::iter(drv.input_derivations.iter())
.map(|(input_drv_path, output_names)| {
// since Derivation is validated, we know this can be parsed.
let input_drv_path =
StorePathRef::from_absolute_path(input_drv_path.as_bytes())
.expect("invalid drv path")
.to_owned();
// look up the derivation object
let input_drv = {
let known_paths = self.known_paths.borrow();
known_paths
.get_drv_by_drvpath(&input_drv_path)
.get_drv_by_drvpath(input_drv_path)
.unwrap_or_else(|| panic!("{} not found", input_drv_path))
.to_owned()
};