tvl-depot/tvix/store
Florian Klink 0db73cb2bd feat(tvix/store): add write_nar function
This adds a function that consumes a [proto::node::Node] pointing to the
root of a (store) path, and writes the contents in NAR serialization to
the passed [std::io::Write].

We need this in various places:

 - tvix-store's calculate_nar() RPC method needs to render a NAR stream
   to get the nar hash, which is necessary to give things imported in
   the store a "NAR-based" store path.

 - communication with (remote) Nix (via daemon protocol) needs a NAR
   representation.

 - Things like nar-bridge, exposing a NAR/NARInfo HTTP interface need a
   NAR representation.

Change-Id: I7fb2e0bf01814a1c09094c0e35394d9d6b3e43b6
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7956
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
2023-01-31 15:28:22 +00:00
..
docs docs(tvix/store): add README, document services and store model 2022-12-26 11:38:52 +00:00
protos refactor(tvix/store): move protobuf build config one level up 2023-01-06 17:57:06 +00:00
src feat(tvix/store): add write_nar function 2023-01-31 15:28:22 +00:00
build.rs feat(tvix/store): implement reflection 2022-12-30 20:25:09 +00:00
Cargo.toml refactor(tvix): introduce nix-compat crate 2023-01-31 13:26:18 +00:00
default.nix refactor(tvix/store): move protobuf build config one level up 2023-01-06 17:57:06 +00:00
README.md docs(tvix/store): add README, document services and store model 2022-12-26 11:38:52 +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 (handled by //tvix/nar-bridge).

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 &
$ 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.