tvl-depot/tvix/store
Florian Klink 5f2c2e79e1 refactor(tvix/nix-compat): move build_store_path out of derivation
This doesn't have anything to do with ATerms, we just happen to be using
the aterm representation of a Derivation as contents.

Moving this into store_path/utils.rs makes these things much cleaner -
Have a build_store_path_from_references function, and a
build_store_path_from_fingerprint helper function that makes use of it.

build_store_path_from_references is invoked from the derivation module
which can be used to calculate the derivation path.

In the derivation module, we also invoke
build_store_path_from_fingerprint during the output path calculation.

Change-Id: Ia8d61a5e8e5d3f396f93593676ed3f5d1a3f1d66
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8367
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
2023-03-30 14:03:35 +00:00
..
docs docs(tvix/store): add document describing why we don't use git trees 2023-03-05 18:33:54 +00:00
protos chore(3p/sources): Bump channels & overlays 2023-03-21 01:31:48 +00:00
src refactor(tvix/nix-compat): move build_store_path out of derivation 2023-03-30 14:03:35 +00:00
build.rs refactor(tvix/store): remove needless borrow in build.rs 2023-02-15 18:40:36 +00:00
Cargo.toml feat(tvix/store/directorysvc): add gRPC client 2023-03-27 08:48:41 +00:00
default.nix chore(tvix/store): drop separate bin package 2023-03-14 22:23:10 +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.