From 501827db59eb9e67ef9c637483efa5a0e5d09c06 Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Tue, 16 Jan 2024 13:14:07 +0200 Subject: 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 Tested-by: BuildkiteCI --- tvix/Cargo.lock | 1 + tvix/Cargo.nix | 4 ++++ tvix/cli/Cargo.toml | 1 + tvix/cli/src/main.rs | 3 +++ tvix/glue/benches/eval.rs | 2 ++ tvix/glue/src/builtins/mod.rs | 10 ++++------ tvix/glue/src/tests/mod.rs | 2 ++ tvix/glue/src/tvix_store_io.rs | 8 ++++++++ 8 files changed, 25 insertions(+), 6 deletions(-) (limited to 'tvix') diff --git a/tvix/Cargo.lock b/tvix/Cargo.lock index 13470fb1850f..83d915f42c48 100644 --- a/tvix/Cargo.lock +++ b/tvix/Cargo.lock @@ -3308,6 +3308,7 @@ dependencies = [ "thiserror", "tokio", "tracing", + "tvix-build", "tvix-castore", "tvix-eval", "tvix-glue", diff --git a/tvix/Cargo.nix b/tvix/Cargo.nix index 170e53dbd22b..c779cdc43232 100644 --- a/tvix/Cargo.nix +++ b/tvix/Cargo.nix @@ -10356,6 +10356,10 @@ rec { name = "tracing"; packageId = "tracing"; } + { + name = "tvix-build"; + packageId = "tvix-build"; + } { name = "tvix-castore"; packageId = "tvix-castore"; diff --git a/tvix/cli/Cargo.toml b/tvix/cli/Cargo.toml index a9bdba254f30..f8101300b194 100644 --- a/tvix/cli/Cargo.toml +++ b/tvix/cli/Cargo.toml @@ -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" } diff --git a/tvix/cli/src/main.rs b/tvix/cli/src/main.rs index 1e54d094b517..7683ad4c59f8 100644 --- a/tvix/cli/src/main.rs +++ b/tvix/cli/src/main.rs @@ -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, args: &Args, explain: bool) -> b blob_service.clone(), directory_service.clone(), path_info_service.into(), + Arc::::default(), tokio_runtime.handle().clone(), )); diff --git a/tvix/glue/benches/eval.rs b/tvix/glue/benches/eval.rs index 12a0f958963e..6a41cd759c73 100644 --- a/tvix/glue/benches/eval.rs +++ b/tvix/glue/benches/eval.rs @@ -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::::default(), TOKIO_RUNTIME.handle().clone(), )); diff --git a/tvix/glue/src/builtins/mod.rs b/tvix/glue/src/builtins/mod.rs index d2378779319b..58be31d7f87b 100644 --- a/tvix/glue/src/builtins/mod.rs +++ b/tvix/glue/src/builtins/mod.rs @@ -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(eval: &mut tvix_eval::Evaluation, io: Rc) -where - IO: AsRef, -{ +pub fn add_derivation_builtins(eval: &mut tvix_eval::Evaluation, io: Rc) { 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::::default(), runtime.handle().clone(), )); diff --git a/tvix/glue/src/tests/mod.rs b/tvix/glue/src/tests/mod.rs index b5b62c5d7e4c..ddc139158049 100644 --- a/tvix/glue/src/tests/mod.rs +++ b/tvix/glue/src/tests/mod.rs @@ -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, true); diff --git a/tvix/glue/src/tvix_store_io.rs b/tvix/glue/src/tvix_store_io.rs index bac0d5e3d3a5..c72b5d108504 100644 --- a/tvix/glue/src/tvix_store_io.rs +++ b/tvix/glue/src/tvix_store_io.rs @@ -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, path_info_service: Arc, std_io: StdIO, + #[allow(dead_code)] + build_service: Arc, tokio_handle: tokio::runtime::Handle, pub(crate) known_paths: RefCell, } @@ -50,6 +53,7 @@ impl TvixStoreIO { blob_service: Arc, directory_service: Arc, path_info_service: Arc, + build_service: Arc, 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::::default(), runtime.handle().clone(), )); let mut eval = tvix_eval::Evaluation::new(io.clone() as Rc, true); -- cgit 1.4.1