docs(tvix/castore/directorysvc): K/V is not necessarily flat

Some implementations of DirectoryService might not allow retrieval of
intermediate Directory nodes, that are not at the "root".

Think about an object store implementation. The client is doing a
get_recursive anyways to reduce the number of roundtrips.

By documenting the fact we don't need to support looking up intermediate
Directory messages, we can just batch all directories into the same
object, keyed by the root.

Change-Id: I019d720186d03c4125cec9191e93d20586a20963
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10988
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Florian Klink 2024-02-20 15:35:55 +07:00 committed by clbot
parent 2277e62c2d
commit b38badf206
3 changed files with 20 additions and 0 deletions

View file

@ -35,6 +35,11 @@ type DirectoryServiceClient interface {
// Keep in mind multiple DirectoryNodes in different parts of the graph might // Keep in mind multiple DirectoryNodes in different parts of the graph might
// have the same digest if they have the same underlying contents, // have the same digest if they have the same underlying contents,
// so sending subsequent ones can be omitted. // so sending subsequent ones can be omitted.
//
// It is okay for certain implementations to only allow retrieval of
// Directory digests that are at the "root", aka the last element that's
// sent in a Put. This makes sense for implementations bundling closures of
// directories together in batches.
Get(ctx context.Context, in *GetDirectoryRequest, opts ...grpc.CallOption) (DirectoryService_GetClient, error) Get(ctx context.Context, in *GetDirectoryRequest, opts ...grpc.CallOption) (DirectoryService_GetClient, error)
// Put uploads a graph of Directory messages. // Put uploads a graph of Directory messages.
// Individual Directory messages need to be send in an order walking up // Individual Directory messages need to be send in an order walking up
@ -131,6 +136,11 @@ type DirectoryServiceServer interface {
// Keep in mind multiple DirectoryNodes in different parts of the graph might // Keep in mind multiple DirectoryNodes in different parts of the graph might
// have the same digest if they have the same underlying contents, // have the same digest if they have the same underlying contents,
// so sending subsequent ones can be omitted. // so sending subsequent ones can be omitted.
//
// It is okay for certain implementations to only allow retrieval of
// Directory digests that are at the "root", aka the last element that's
// sent in a Put. This makes sense for implementations bundling closures of
// directories together in batches.
Get(*GetDirectoryRequest, DirectoryService_GetServer) error Get(*GetDirectoryRequest, DirectoryService_GetServer) error
// Put uploads a graph of Directory messages. // Put uploads a graph of Directory messages.
// Individual Directory messages need to be send in an order walking up // Individual Directory messages need to be send in an order walking up

View file

@ -14,6 +14,11 @@ service DirectoryService {
// Keep in mind multiple DirectoryNodes in different parts of the graph might // Keep in mind multiple DirectoryNodes in different parts of the graph might
// have the same digest if they have the same underlying contents, // have the same digest if they have the same underlying contents,
// so sending subsequent ones can be omitted. // so sending subsequent ones can be omitted.
//
// It is okay for certain implementations to only allow retrieval of
// Directory digests that are at the "root", aka the last element that's
// sent in a Put. This makes sense for implementations bundling closures of
// directories together in batches.
rpc Get(GetDirectoryRequest) returns (stream Directory); rpc Get(GetDirectoryRequest) returns (stream Directory);
// Put uploads a graph of Directory messages. // Put uploads a graph of Directory messages.

View file

@ -23,6 +23,11 @@ pub trait DirectoryService: Send + Sync {
/// Looks up a single Directory message by its digest. /// Looks up a single Directory message by its digest.
/// The returned Directory message *must* be valid. /// The returned Directory message *must* be valid.
/// In case the directory is not found, Ok(None) is returned. /// In case the directory is not found, Ok(None) is returned.
///
/// It is okay for certain implementations to only allow retrieval of
/// Directory digests that are at the "root", aka the last element that's
/// sent to a DirectoryPutter. This makes sense for implementations bundling
/// closures of directories together in batches.
async fn get(&self, digest: &B3Digest) -> Result<Option<proto::Directory>, Error>; async fn get(&self, digest: &B3Digest) -> Result<Option<proto::Directory>, Error>;
/// Uploads a single Directory message, and returns the calculated /// Uploads a single Directory message, and returns the calculated
/// digest, or an error. An error *must* also be returned if the message is /// digest, or an error. An error *must* also be returned if the message is