2023-09-21 21:32:44 +02:00
|
|
|
[package]
|
|
|
|
name = "tvix-castore"
|
|
|
|
version = "0.1.0"
|
|
|
|
edition = "2021"
|
|
|
|
|
|
|
|
[dependencies]
|
2024-05-16 10:33:23 +02:00
|
|
|
async-compression = { version = "0.4.9", features = ["tokio", "zstd"]}
|
2023-09-21 21:32:44 +02:00
|
|
|
async-stream = "0.3.5"
|
2024-03-03 13:40:54 +01:00
|
|
|
async-tempfile = "0.4.0"
|
|
|
|
blake3 = { version = "1.3.1", features = ["rayon", "std", "traits-preview"] }
|
|
|
|
bstr = "1.6.0"
|
2023-09-21 21:32:44 +02:00
|
|
|
bytes = "1.4.0"
|
|
|
|
data-encoding = "2.3.3"
|
2024-03-03 13:40:54 +01:00
|
|
|
digest = "0.10.7"
|
2024-03-01 17:00:53 +01:00
|
|
|
fastcdc = { version = "3.1.0", features = ["tokio"] }
|
2023-12-24 21:56:48 +01:00
|
|
|
futures = "0.3.30"
|
2023-09-21 21:32:44 +02:00
|
|
|
lazy_static = "1.4.0"
|
2024-03-19 10:46:12 +01:00
|
|
|
object_store = { version = "0.9.1", features = ["http"] }
|
chore(tvix): move store/fs to castore/fs
With the recent introduction of the RootNodes trait, there's nothing in
the fs module pulling in tvix-store dependencies, so it can live in
tvix-castore.
This allows other crates to make use of TvixStoreFS, without having to
pull in tvix-store.
For example, a tvix-build using a fuse mountpoint at /nix/store doesn't
need a PathInfoService to hold the root nodes that should be present,
but just a list.
tvix-store now has a pathinfoservice/fs module, which contains the
necessary glue logic to implement the RootNodes trait for a
PathInfoService.
To satisfy Rust orphan rules for trait implementations, we had to add a
small wrapper struct. It's mostly hidden away by the make_fs helper
function returning a TvixStoreFs.
It can't be entirely private, as its still leaking into the concrete
type of TvixStoreFS.
tvix-store still has `fuse` and `virtiofs` features, but they now simply
enable these features in the `tvix-castore` crate they depend on.
The tests for the fuse functionality stay in tvix-store for now, as
they populate the root nodes through a PathInfoService.
Once above mentioned "list of root nodes" implementation exists, we
might want to shuffle this around one more time.
Fixes b/341.
Change-Id: I989f664827a5a361b23b34368d242d10c157c756
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10378
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
2023-12-16 23:16:22 +01:00
|
|
|
parking_lot = "0.12.1"
|
2023-09-21 21:32:44 +02:00
|
|
|
pin-project-lite = "0.2.13"
|
2023-10-08 11:47:33 +02:00
|
|
|
prost = "0.12.1"
|
2023-12-11 20:25:34 +01:00
|
|
|
sled = { version = "0.34.7" }
|
2023-09-21 21:32:44 +02:00
|
|
|
thiserror = "1.0.38"
|
|
|
|
tokio-stream = { version = "0.1.14", features = ["fs", "net"] }
|
2024-05-16 10:33:23 +02:00
|
|
|
tokio-util = { version = "0.7.9", features = ["io", "io-util", "codec"] }
|
2024-02-24 01:55:07 +01:00
|
|
|
tokio-tar = "0.3.1"
|
2023-10-08 11:47:33 +02:00
|
|
|
tokio = { version = "1.32.0", features = ["fs", "macros", "net", "rt", "rt-multi-thread", "signal"] }
|
2024-03-15 21:53:43 +01:00
|
|
|
tonic = "0.11.0"
|
2023-09-21 21:32:44 +02:00
|
|
|
tower = "0.4.13"
|
|
|
|
tracing = "0.1.37"
|
|
|
|
url = "2.4.0"
|
|
|
|
walkdir = "2.4.0"
|
2024-03-01 17:00:53 +01:00
|
|
|
zstd = "0.13.0"
|
2024-03-19 11:12:03 +01:00
|
|
|
serde = { version = "1.0.197", features = [ "derive" ] }
|
|
|
|
serde_with = "3.7.0"
|
|
|
|
serde_qs = "0.12.0"
|
fix(tvix/castore/directory): fix graph traversal
Use a proper graph library to ensure all nodes are reachable from the
root.
We had a bit of that handrolled during add(), as well as later, which
had an annoying bug:
Redundant nodes were omitted during insert, but when returning the list
during finalize, we did not properly account they need to be introduced
before their parents are sent.
We now simply populate a petgraph DiGraph during insert (skipping
inserting nodes we already saw), and use petgraph's DfsPostOrder to
traverse the graph during finalize.
If the number of returned indices equals the total number of nodes in
the graph, all nodes are reachable from the root, we can consume the
graph and return the nodes as a vec, in the same order as the traversal
(and insertion).
Providing a regression test for the initial bug is challenging, as the
current code uses a bunch of HashSets. I manually tested ingesting a
full NixOS closure using this mechanism (via gRPC, which exposes this
problem, as it validates twice), and it now works.
Change-Id: Ic1d5e3e981f2993cc08c5c6b60ad895e578326dc
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11418
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: Connor Brewster <cbrewster@hey.com>
Tested-by: BuildkiteCI
2024-04-13 22:33:18 +02:00
|
|
|
petgraph = "0.6.4"
|
2024-03-19 11:12:03 +01:00
|
|
|
|
|
|
|
[dependencies.bigtable_rs]
|
|
|
|
optional = true
|
|
|
|
# https://github.com/liufuyang/bigtable_rs/pull/72
|
|
|
|
git = "https://github.com/flokli/bigtable_rs"
|
|
|
|
rev = "0af404741dfc40eb9fa99cf4d4140a09c5c20df7"
|
2023-09-21 21:32:44 +02:00
|
|
|
|
chore(tvix): move store/fs to castore/fs
With the recent introduction of the RootNodes trait, there's nothing in
the fs module pulling in tvix-store dependencies, so it can live in
tvix-castore.
This allows other crates to make use of TvixStoreFS, without having to
pull in tvix-store.
For example, a tvix-build using a fuse mountpoint at /nix/store doesn't
need a PathInfoService to hold the root nodes that should be present,
but just a list.
tvix-store now has a pathinfoservice/fs module, which contains the
necessary glue logic to implement the RootNodes trait for a
PathInfoService.
To satisfy Rust orphan rules for trait implementations, we had to add a
small wrapper struct. It's mostly hidden away by the make_fs helper
function returning a TvixStoreFs.
It can't be entirely private, as its still leaking into the concrete
type of TvixStoreFS.
tvix-store still has `fuse` and `virtiofs` features, but they now simply
enable these features in the `tvix-castore` crate they depend on.
The tests for the fuse functionality stay in tvix-store for now, as
they populate the root nodes through a PathInfoService.
Once above mentioned "list of root nodes" implementation exists, we
might want to shuffle this around one more time.
Fixes b/341.
Change-Id: I989f664827a5a361b23b34368d242d10c157c756
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10378
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
2023-12-16 23:16:22 +01:00
|
|
|
[dependencies.fuse-backend-rs]
|
|
|
|
optional = true
|
|
|
|
version = "0.11.0"
|
|
|
|
|
|
|
|
[dependencies.libc]
|
|
|
|
optional = true
|
|
|
|
version = "0.2.144"
|
|
|
|
|
2023-09-21 21:32:44 +02:00
|
|
|
[dependencies.tonic-reflection]
|
|
|
|
optional = true
|
2024-03-15 21:53:43 +01:00
|
|
|
version = "0.11.0"
|
2023-09-21 21:32:44 +02:00
|
|
|
|
chore(tvix): move store/fs to castore/fs
With the recent introduction of the RootNodes trait, there's nothing in
the fs module pulling in tvix-store dependencies, so it can live in
tvix-castore.
This allows other crates to make use of TvixStoreFS, without having to
pull in tvix-store.
For example, a tvix-build using a fuse mountpoint at /nix/store doesn't
need a PathInfoService to hold the root nodes that should be present,
but just a list.
tvix-store now has a pathinfoservice/fs module, which contains the
necessary glue logic to implement the RootNodes trait for a
PathInfoService.
To satisfy Rust orphan rules for trait implementations, we had to add a
small wrapper struct. It's mostly hidden away by the make_fs helper
function returning a TvixStoreFs.
It can't be entirely private, as its still leaking into the concrete
type of TvixStoreFS.
tvix-store still has `fuse` and `virtiofs` features, but they now simply
enable these features in the `tvix-castore` crate they depend on.
The tests for the fuse functionality stay in tvix-store for now, as
they populate the root nodes through a PathInfoService.
Once above mentioned "list of root nodes" implementation exists, we
might want to shuffle this around one more time.
Fixes b/341.
Change-Id: I989f664827a5a361b23b34368d242d10c157c756
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10378
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
2023-12-16 23:16:22 +01:00
|
|
|
[dependencies.vhost]
|
|
|
|
optional = true
|
|
|
|
version = "0.6"
|
|
|
|
|
|
|
|
[dependencies.vhost-user-backend]
|
|
|
|
optional = true
|
|
|
|
version = "0.8"
|
|
|
|
|
|
|
|
[dependencies.virtio-queue]
|
|
|
|
optional = true
|
|
|
|
version = "0.7"
|
|
|
|
|
|
|
|
[dependencies.vm-memory]
|
|
|
|
optional = true
|
|
|
|
version = "0.10"
|
|
|
|
|
|
|
|
[dependencies.vmm-sys-util]
|
|
|
|
optional = true
|
|
|
|
version = "0.11"
|
|
|
|
|
|
|
|
[dependencies.virtio-bindings]
|
|
|
|
optional = true
|
|
|
|
version = "0.2.1"
|
|
|
|
|
2023-09-21 21:32:44 +02:00
|
|
|
[build-dependencies]
|
2023-10-08 11:47:33 +02:00
|
|
|
prost-build = "0.12.1"
|
2024-03-15 21:53:43 +01:00
|
|
|
tonic-build = "0.11.0"
|
2023-09-21 21:32:44 +02:00
|
|
|
|
|
|
|
[dev-dependencies]
|
2024-03-19 11:12:03 +01:00
|
|
|
async-process = "2.1.0"
|
2024-04-10 13:37:45 +02:00
|
|
|
rstest = "0.19.0"
|
2023-09-21 21:32:44 +02:00
|
|
|
tempfile = "3.3.0"
|
2023-10-08 13:33:43 +02:00
|
|
|
tokio-retry = "0.3.0"
|
2023-10-27 03:12:26 +02:00
|
|
|
hex-literal = "0.4.1"
|
2024-03-23 21:49:49 +01:00
|
|
|
rstest_reuse = "0.6.0"
|
2024-04-14 17:01:24 +02:00
|
|
|
xattr = "1.3.1"
|
2023-09-21 21:32:44 +02:00
|
|
|
|
|
|
|
[features]
|
2024-05-26 16:27:10 +02:00
|
|
|
default = ["cloud"]
|
2024-03-19 10:46:12 +01:00
|
|
|
cloud = [
|
2024-03-19 11:12:03 +01:00
|
|
|
"dep:bigtable_rs",
|
2024-03-19 10:46:12 +01:00
|
|
|
"object_store/aws",
|
|
|
|
"object_store/azure",
|
|
|
|
"object_store/gcp",
|
|
|
|
]
|
chore(tvix): move store/fs to castore/fs
With the recent introduction of the RootNodes trait, there's nothing in
the fs module pulling in tvix-store dependencies, so it can live in
tvix-castore.
This allows other crates to make use of TvixStoreFS, without having to
pull in tvix-store.
For example, a tvix-build using a fuse mountpoint at /nix/store doesn't
need a PathInfoService to hold the root nodes that should be present,
but just a list.
tvix-store now has a pathinfoservice/fs module, which contains the
necessary glue logic to implement the RootNodes trait for a
PathInfoService.
To satisfy Rust orphan rules for trait implementations, we had to add a
small wrapper struct. It's mostly hidden away by the make_fs helper
function returning a TvixStoreFs.
It can't be entirely private, as its still leaking into the concrete
type of TvixStoreFS.
tvix-store still has `fuse` and `virtiofs` features, but they now simply
enable these features in the `tvix-castore` crate they depend on.
The tests for the fuse functionality stay in tvix-store for now, as
they populate the root nodes through a PathInfoService.
Once above mentioned "list of root nodes" implementation exists, we
might want to shuffle this around one more time.
Fixes b/341.
Change-Id: I989f664827a5a361b23b34368d242d10c157c756
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10378
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
2023-12-16 23:16:22 +01:00
|
|
|
fs = ["dep:libc", "dep:fuse-backend-rs"]
|
|
|
|
virtiofs = [
|
|
|
|
"fs",
|
|
|
|
"dep:vhost",
|
|
|
|
"dep:vhost-user-backend",
|
|
|
|
"dep:virtio-queue",
|
|
|
|
"dep:vm-memory",
|
|
|
|
"dep:vmm-sys-util",
|
|
|
|
"dep:virtio-bindings",
|
|
|
|
"fuse-backend-rs?/vhost-user-fs", # impl FsCacheReqHandler for SlaveFsCacheReq
|
|
|
|
"fuse-backend-rs?/virtiofs",
|
|
|
|
]
|
|
|
|
fuse = ["fs"]
|
2023-10-08 13:33:43 +02:00
|
|
|
tonic-reflection = ["dep:tonic-reflection"]
|
2024-05-02 23:09:46 +02:00
|
|
|
# Whether to run the integration tests.
|
|
|
|
# Requires the following packages in $PATH:
|
|
|
|
# cbtemulator, google-cloud-bigtable-tool
|
|
|
|
integration = []
|
2024-05-13 18:42:50 +02:00
|
|
|
|
|
|
|
[lints]
|
|
|
|
workspace = true
|