From b3ca1a78eb780e427a85dd1bbe1c649f998dee65 Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Sun, 28 May 2023 09:32:21 +0200 Subject: feat(tvix/store): add mount command to entrypoint and fuse mod `tvix-store mount PATH` will mount the tvix-store to the given path. Change-Id: Icb82a6b3cb8a22eec856c375a28ae5580403833f Reviewed-on: https://cl.tvl.fyi/c/depot/+/8665 Reviewed-by: tazjin Tested-by: BuildkiteCI Autosubmit: flokli --- tvix/store/src/bin/tvix-store.rs | 26 ++++++++++++++++++++++++++ tvix/store/src/fuse/mod.rs | 24 ++++++++++++++++++++++++ tvix/store/src/lib.rs | 5 +++++ 3 files changed, 55 insertions(+) create mode 100644 tvix/store/src/fuse/mod.rs (limited to 'tvix') diff --git a/tvix/store/src/bin/tvix-store.rs b/tvix/store/src/bin/tvix-store.rs index 8c278c4339..ce27011571 100644 --- a/tvix/store/src/bin/tvix-store.rs +++ b/tvix/store/src/bin/tvix-store.rs @@ -25,6 +25,7 @@ use tvix_store::proto::GRPCBlobServiceWrapper; use tvix_store::proto::GRPCDirectoryServiceWrapper; use tvix_store::proto::GRPCPathInfoServiceWrapper; use tvix_store::TvixStoreIO; +use tvix_store::FUSE; #[cfg(feature = "reflection")] use tvix_store::proto::FILE_DESCRIPTOR_SET; @@ -59,6 +60,12 @@ enum Commands { #[clap(value_name = "PATH")] paths: Vec, }, + /// Mounts a tvix-store at the given mountpoint + #[cfg(feature = "fuse")] + Mount { + #[clap(value_name = "PATH")] + dest: PathBuf, + }, } #[tokio::main] @@ -172,6 +179,25 @@ async fn main() -> Result<(), Box> { try_join_all(tasks).await?; } + #[cfg(feature = "fuse")] + Commands::Mount { dest } => { + let blob_service = GRPCBlobService::from_client( + BlobServiceClient::connect("http://[::1]:8000").await?, + ); + let directory_service = GRPCDirectoryService::from_client( + DirectoryServiceClient::connect("http://[::1]:8000").await?, + ); + let path_info_service_client = + PathInfoServiceClient::connect("http://[::1]:8000").await?; + let path_info_service = + GRPCPathInfoService::from_client(path_info_service_client.clone()); + + tokio::task::spawn_blocking(move || { + let f = FUSE::new(path_info_service, directory_service, blob_service); + fuser::mount2(f, &dest, &[]) + }) + .await?? + } }; Ok(()) } diff --git a/tvix/store/src/fuse/mod.rs b/tvix/store/src/fuse/mod.rs new file mode 100644 index 0000000000..a93f482ebf --- /dev/null +++ b/tvix/store/src/fuse/mod.rs @@ -0,0 +1,24 @@ +use crate::{ + blobservice::BlobService, directoryservice::DirectoryService, pathinfoservice::PathInfoService, +}; + +pub struct FUSE { + blob_service: BS, + directory_service: DS, + path_info_service: PS, +} + +impl FUSE { + pub fn new(path_info_service: PS, directory_service: DS, blob_service: BS) -> Self { + Self { + blob_service, + path_info_service, + directory_service, + } + } +} + +impl fuser::Filesystem + for FUSE +{ +} diff --git a/tvix/store/src/lib.rs b/tvix/store/src/lib.rs index 7ae8587f8b..9ac36ac94f 100644 --- a/tvix/store/src/lib.rs +++ b/tvix/store/src/lib.rs @@ -1,5 +1,7 @@ mod digests; mod errors; +#[cfg(feature = "fuse")] +mod fuse; mod store_io; pub mod blobservice; @@ -13,5 +15,8 @@ pub use digests::B3Digest; pub use errors::Error; pub use store_io::TvixStoreIO; +#[cfg(feature = "fuse")] +pub use fuse::FUSE; + #[cfg(test)] mod tests; -- cgit 1.4.1