tvl-depot/tvix/store
Connor Brewster 6b7c936bc5 refactor(tvix/store/fuse): Switch from fuser to fuse-backend-rs
This switches the FUSE implementation from fuser to fuse-backend-rs.
fuse-backend-rs is designed to work with both FUSE and virtiofs.
Virtiofs support will make it possible to plug the tvix-store into a
microvm and have `/nix/store` access without having to setup FUSE inside
the guest.

Additionally fuse-backend-rs has nice support for running multiple FUSE
threads and has some async support.

The goal of this commit is to mechanically switch over to
fuse-backend-rs with minimal changes. I did have to add some locks here
and there because fuse-backend-rs uses `&self` on all methods whereas
fuser uses `&mut self`. `&self` is required for concurrent access to the
FUSE server, so this makes sense.

We can consider switching to concurrent maps and use some other
techniques to reduce lock contention and critical section size.

Issue: https://b.tvl.fyi/issues/305

Change-Id: Icde5a58c6eef98f8984c1e04e980b756dfb76b47
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9341
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
2023-09-20 14:21:32 +00:00
..
docs docs(tvix/store): various improvements 2023-07-07 09:48:32 +00:00
protos chore(tvix/store/protos): drop unused fields for now 2023-09-18 10:33:30 +00:00
src refactor(tvix/store/fuse): Switch from fuser to fuse-backend-rs 2023-09-20 14:21:32 +00:00
build.rs feat(tvix/store/proto): use Bytes instead of Vec<u8> 2023-07-22 09:03:02 +00:00
Cargo.toml refactor(tvix/store/fuse): Switch from fuser to fuse-backend-rs 2023-09-20 14:21:32 +00:00
default.nix feat(tvix/store): add simple integration test 2023-09-15 21:00:54 +00:00
README.md docs(tvix/store): drop nar-bridge references 2023-06-09 15:33:14 +00:00

//tvix/store

This contains the code hosting the tvix-store.

For the local store, Nix realizes files on the filesystem in /nix/store (and maintains some metadata in a SQLite database). For "remote stores", it communicates this metadata in NAR (Nix ARchive) and NARInfo format.

Compared to the Nix model, tvix-store stores data on a much more granular level than that, which provides more deduplication possibilities, and more granular copying.

However, enough information is preserved to still be able to render NAR and NARInfo when needed.

More Information

Check the protos/ subfolder for the definition of the exact RPC methods and messages.

Interacting with the GRPC service manually

The shell environment in //tvix provides evans, which is an interactive REPL-based gPRC client.

You can use it to connect to a tvix-store and call the various RPC methods.

$ cargo run -- daemon &
$ evans --host localhost --port 8000 -r repl
  ______
 |  ____|
 | |__    __   __   __ _   _ __    ___
 |  __|   \ \ / /  / _. | | '_ \  / __|
 | |____   \ V /  | (_| | | | | | \__ \
 |______|   \_/    \__,_| |_| |_| |___/

 more expressive universal gRPC client


tvix.store.v1@localhost:8000> service BlobService

tvix.store.v1.BlobService@localhost:8000> call Put --bytes-from-file
data (TYPE_BYTES) => /run/current-system/system
{
  "digest": "KOM3/IHEx7YfInAnlJpAElYezq0Sxn9fRz7xuClwNfA="
}

tvix.store.v1.BlobService@localhost:8000> call Get --bytes-as-base64
digest (TYPE_BYTES) => KOM3/IHEx7YfInAnlJpAElYezq0Sxn9fRz7xuClwNfA=
{
  "data": "eDg2XzY0LWxpbnV4"
}

$ echo eDg2XzY0LWxpbnV4 | base64 -d
x86_64-linux

Thanks to tvix-store providing gRPC Server Reflection (with reflection feature), you don't need to point evans to the .proto files.