tvl-depot/tvix/store
Florian Klink 3816eaa5e9 feat(tvix/store): add simple integration test
This imports the docs folder into the tvix store, and ensures it comes
up with the same store path as Nix.

While we validate hashes in general through tvix-cli output path checks
already, it doesn't include the tvix-store CLI itself.

See https://cl.tvl.fyi/c/depot/+/9329/comment/339f0720_524f0104/
for context.

Change-Id: I239ce5b6a07cb962b242142ab716693359b8674c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9338
Reviewed-by: raitobezarius <tvl@lahfa.xyz>
Tested-by: BuildkiteCI
Reviewed-by: Connor Brewster <cbrewster@hey.com>
2023-09-15 21:00:54 +00:00
..
docs docs(tvix/store): various improvements 2023-07-07 09:48:32 +00:00
protos fix(tvix/protos): support []byte node names 2023-09-09 12:13:02 +00:00
src feat(tvix/store/import): print store path to stdout 2023-09-15 21:00:54 +00:00
build.rs feat(tvix/store/proto): use Bytes instead of Vec<u8> 2023-07-22 09:03:02 +00:00
Cargo.toml feat(tvix/store): fix ctrl-c handling on mount command 2023-09-05 21:13:49 +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.