2024-01-20 23:25:39 +01:00
|
|
|
use std::collections::BTreeMap;
|
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
|
|
|
|
|
|
|
use crate::{proto::node::Node, Error};
|
2023-12-23 11:24:14 +01:00
|
|
|
use bytes::Bytes;
|
2024-01-20 23:25:39 +01:00
|
|
|
use futures::stream::BoxStream;
|
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
|
|
|
use tonic::async_trait;
|
|
|
|
|
|
|
|
/// Provides an interface for looking up root nodes in tvix-castore by given
|
|
|
|
/// a lookup key (usually the basename), and optionally allow a listing.
|
|
|
|
#[async_trait]
|
|
|
|
pub trait RootNodes: Send + Sync {
|
|
|
|
/// Looks up a root CA node based on the basename of the node in the root
|
|
|
|
/// directory of the filesystem.
|
|
|
|
async fn get_by_basename(&self, name: &[u8]) -> Result<Option<Node>, Error>;
|
|
|
|
|
|
|
|
/// Lists all root CA nodes in the filesystem. An error can be returned
|
|
|
|
/// in case listing is not allowed
|
2024-01-20 23:25:39 +01:00
|
|
|
fn list(&self) -> BoxStream<Result<Node, Error>>;
|
2023-12-23 11:24:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[async_trait]
|
|
|
|
/// Implements RootNodes for something deref'ing to a BTreeMap of Nodes, where
|
|
|
|
/// the key is the node name.
|
|
|
|
impl<T> RootNodes for T
|
|
|
|
where
|
2024-01-09 10:04:29 +01:00
|
|
|
T: AsRef<BTreeMap<Bytes, Node>> + Send + Sync,
|
2023-12-23 11:24:14 +01:00
|
|
|
{
|
|
|
|
async fn get_by_basename(&self, name: &[u8]) -> Result<Option<Node>, Error> {
|
2024-01-09 10:04:29 +01:00
|
|
|
Ok(self.as_ref().get(name).cloned())
|
2023-12-23 11:24:14 +01:00
|
|
|
}
|
|
|
|
|
2024-01-20 23:25:39 +01:00
|
|
|
fn list(&self) -> BoxStream<Result<Node, Error>> {
|
2024-01-09 10:04:29 +01:00
|
|
|
Box::pin(tokio_stream::iter(
|
|
|
|
self.as_ref().iter().map(|(_, v)| Ok(v.clone())),
|
|
|
|
))
|
2023-12-23 11:24:14 +01: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
|
|
|
}
|