refactor(tvix/glue): add BuildService to TvixStoreIO

TvixStoreIO triggers builds whenever IO into a not-yet-built store path
is requested, if it knows how to build that path.

Change-Id: If30e9db6be2f2a30cbc9d0576f357f3ecfa0d35a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10645
Reviewed-by: raitobezarius <tvl@lahfa.xyz>
Tested-by: BuildkiteCI
This commit is contained in:
Florian Klink 2024-01-16 13:14:07 +02:00 committed by flokli
parent 12ae96cff2
commit 501827db59
8 changed files with 25 additions and 6 deletions

1
tvix/Cargo.lock generated
View file

@ -3308,6 +3308,7 @@ dependencies = [
"thiserror",
"tokio",
"tracing",
"tvix-build",
"tvix-castore",
"tvix-eval",
"tvix-glue",

View file

@ -10356,6 +10356,10 @@ rec {
name = "tracing";
packageId = "tracing";
}
{
name = "tvix-build";
packageId = "tvix-build";
}
{
name = "tvix-castore";
packageId = "tvix-castore";

View file

@ -9,6 +9,7 @@ path = "src/main.rs"
[dependencies]
nix-compat = { path = "../nix-compat" }
tvix-build = { path = "../build" }
tvix-castore = { path = "../castore" }
tvix-store = { path = "../store", default-features = false, features = []}
tvix-eval = { path = "../eval" }

View file

@ -1,7 +1,9 @@
use clap::Parser;
use rustyline::{error::ReadlineError, Editor};
use std::rc::Rc;
use std::sync::Arc;
use std::{fs, path::PathBuf};
use tvix_build::buildservice::DummyBuildService;
use tvix_eval::builtins::impure_builtins;
use tvix_eval::observer::{DisassemblingObserver, TracingObserver};
use tvix_eval::{EvalIO, Value};
@ -88,6 +90,7 @@ fn interpret(code: &str, path: Option<PathBuf>, args: &Args, explain: bool) -> b
blob_service.clone(),
directory_service.clone(),
path_info_service.into(),
Arc::<DummyBuildService>::default(),
tokio_runtime.handle().clone(),
));

View file

@ -1,6 +1,7 @@
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use lazy_static::lazy_static;
use std::{env, rc::Rc, sync::Arc, time::Duration};
use tvix_build::buildservice::DummyBuildService;
use tvix_castore::{
blobservice::{BlobService, MemoryBlobService},
directoryservice::{DirectoryService, MemoryDirectoryService},
@ -33,6 +34,7 @@ fn interpret(code: &str) {
BLOB_SERVICE.clone(),
DIRECTORY_SERVICE.clone(),
PATH_INFO_SERVICE.clone(),
Arc::<DummyBuildService>::default(),
TOKIO_RUNTIME.handle().clone(),
));

View file

@ -8,7 +8,6 @@ mod derivation;
mod derivation_error;
pub use derivation_error::Error as DerivationError;
use tvix_eval::EvalIO;
/// Adds derivation-related builtins to the passed [tvix_eval::Evaluation].
///
@ -16,10 +15,7 @@ use tvix_eval::EvalIO;
///
/// As they need to interact with `known_paths`, we also need to pass in
/// `known_paths`.
pub fn add_derivation_builtins<IO>(eval: &mut tvix_eval::Evaluation<IO>, io: Rc<TvixStoreIO>)
where
IO: AsRef<dyn EvalIO>,
{
pub fn add_derivation_builtins<IO>(eval: &mut tvix_eval::Evaluation<IO>, io: Rc<TvixStoreIO>) {
eval.builtins
.extend(derivation::derivation_builtins::builtins(io));
@ -30,13 +26,14 @@ where
#[cfg(test)]
mod tests {
use std::rc::Rc;
use std::{rc::Rc, sync::Arc};
use crate::tvix_store_io::TvixStoreIO;
use super::add_derivation_builtins;
use nix_compat::store_path::hash_placeholder;
use test_case::test_case;
use tvix_build::buildservice::DummyBuildService;
use tvix_eval::{EvalIO, EvaluationResult};
use tvix_store::utils::construct_services;
@ -54,6 +51,7 @@ mod tests {
blob_service,
directory_service,
path_info_service.into(),
Arc::<DummyBuildService>::default(),
runtime.handle().clone(),
));

View file

@ -2,6 +2,7 @@ use std::{rc::Rc, sync::Arc};
use pretty_assertions::assert_eq;
use std::path::PathBuf;
use tvix_build::buildservice::DummyBuildService;
use tvix_castore::{
blobservice::{BlobService, MemoryBlobService},
directoryservice::{DirectoryService, MemoryDirectoryService},
@ -43,6 +44,7 @@ fn eval_test(code_path: PathBuf, expect_success: bool) {
blob_service,
directory_service,
path_info_service.into(),
Arc::new(DummyBuildService::default()),
tokio_runtime.handle().clone(),
));
let mut eval = tvix_eval::Evaluation::new(tvix_store_io.clone() as Rc<dyn EvalIO>, true);

View file

@ -9,6 +9,7 @@ use std::{
};
use tokio::io::AsyncReadExt;
use tracing::{error, instrument, warn};
use tvix_build::buildservice::BuildService;
use tvix_eval::{EvalIO, FileType, StdIO};
use tvix_castore::{
@ -41,6 +42,8 @@ pub struct TvixStoreIO {
directory_service: Arc<dyn DirectoryService>,
path_info_service: Arc<dyn PathInfoService>,
std_io: StdIO,
#[allow(dead_code)]
build_service: Arc<dyn BuildService>,
tokio_handle: tokio::runtime::Handle,
pub(crate) known_paths: RefCell<KnownPaths>,
}
@ -50,6 +53,7 @@ impl TvixStoreIO {
blob_service: Arc<dyn BlobService>,
directory_service: Arc<dyn DirectoryService>,
path_info_service: Arc<dyn PathInfoService>,
build_service: Arc<dyn BuildService>,
tokio_handle: tokio::runtime::Handle,
) -> Self {
Self {
@ -57,6 +61,7 @@ impl TvixStoreIO {
directory_service,
path_info_service,
std_io: StdIO {},
build_service,
tokio_handle,
known_paths: Default::default(),
}
@ -292,6 +297,7 @@ mod tests {
use std::{path::Path, rc::Rc, sync::Arc};
use tempfile::TempDir;
use tvix_build::buildservice::DummyBuildService;
use tvix_castore::{
blobservice::{BlobService, MemoryBlobService},
directoryservice::{DirectoryService, MemoryDirectoryService},
@ -314,12 +320,14 @@ mod tests {
blob_service.clone(),
directory_service.clone(),
));
let runtime = tokio::runtime::Runtime::new().unwrap();
let io = Rc::new(TvixStoreIO::new(
blob_service.clone(),
directory_service.clone(),
path_info_service,
Arc::<DummyBuildService>::default(),
runtime.handle().clone(),
));
let mut eval = tvix_eval::Evaluation::new(io.clone() as Rc<dyn EvalIO>, true);