about summary refs log tree commit diff
path: root/tvix
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2024-01-16T11·14+0200
committerflokli <flokli@flokli.de>2024-01-18T14·30+0000
commit501827db59eb9e67ef9c637483efa5a0e5d09c06 (patch)
tree67789854b7b4984685fad4f40295a523cf0e09cf /tvix
parent12ae96cff2e925f502cee8afb4f8dcf54aba27d8 (diff)
refactor(tvix/glue): add BuildService to TvixStoreIO r/7411
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
Diffstat (limited to 'tvix')
-rw-r--r--tvix/Cargo.lock1
-rw-r--r--tvix/Cargo.nix4
-rw-r--r--tvix/cli/Cargo.toml1
-rw-r--r--tvix/cli/src/main.rs3
-rw-r--r--tvix/glue/benches/eval.rs2
-rw-r--r--tvix/glue/src/builtins/mod.rs10
-rw-r--r--tvix/glue/src/tests/mod.rs2
-rw-r--r--tvix/glue/src/tvix_store_io.rs8
8 files changed, 25 insertions, 6 deletions
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
@@ -10357,6 +10357,10 @@ rec {
             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<PathBuf>, args: &Args, explain: bool) -> b
         blob_service.clone(),
         directory_service.clone(),
         path_info_service.into(),
+        Arc::<DummyBuildService>::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::<DummyBuildService>::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<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(),
         ));
 
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<dyn EvalIO>, 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<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);