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:
		
							parent
							
								
									12ae96cff2
								
							
						
					
					
						commit
						501827db59
					
				
					 8 changed files with 25 additions and 6 deletions
				
			
		
							
								
								
									
										1
									
								
								tvix/Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								tvix/Cargo.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -3308,6 +3308,7 @@ dependencies = [
 | 
			
		|||
 "thiserror",
 | 
			
		||||
 "tokio",
 | 
			
		||||
 "tracing",
 | 
			
		||||
 "tvix-build",
 | 
			
		||||
 "tvix-castore",
 | 
			
		||||
 "tvix-eval",
 | 
			
		||||
 "tvix-glue",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10356,6 +10356,10 @@ rec {
 | 
			
		|||
            name = "tracing";
 | 
			
		||||
            packageId = "tracing";
 | 
			
		||||
          }
 | 
			
		||||
          {
 | 
			
		||||
            name = "tvix-build";
 | 
			
		||||
            packageId = "tvix-build";
 | 
			
		||||
          }
 | 
			
		||||
          {
 | 
			
		||||
            name = "tvix-castore";
 | 
			
		||||
            packageId = "tvix-castore";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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" }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(),
 | 
			
		||||
    ));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(),
 | 
			
		||||
    ));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(),
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue