docs(store/protos): update comment on blobstore Read and Put
Further emphasize Read() can be used to ask for blobs OR chunks, and that clients usually want to stat and then request (smaller) chunks, rather than reading whole blobs. Also clarify that the chunking used to send BlobChunks over has nothing to do with the chunk sizes communicated in a Stat() request. Change-Id: Ia615d190aae570611de2655b11342a14d0b75976 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8028 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
0a27344953
commit
87e1934f2d
3 changed files with 56 additions and 8 deletions
|
@ -161,7 +161,7 @@ type ReadBlobRequest struct {
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
// The blake3 digest of the blob requested
|
// The blake3 digest of the blob or chunk requested
|
||||||
Digest []byte `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
|
Digest []byte `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,27 @@ service BlobService {
|
||||||
// contain a single chunk.
|
// contain a single chunk.
|
||||||
rpc Stat(StatBlobRequest) returns (BlobMeta);
|
rpc Stat(StatBlobRequest) returns (BlobMeta);
|
||||||
|
|
||||||
// Read returns a stream of BlobChunk, which is just a stream of bytes - not necessarily
|
// Read returns a stream of BlobChunk, which is just a stream of bytes with
|
||||||
// using the chunking that's returned in the reply of a Stat() call.
|
// the digest specified in ReadBlobRequest.
|
||||||
|
//
|
||||||
|
// The server may decide on whatever chunking it may seem fit as a size for
|
||||||
|
// the individual BlobChunk sent in the response stream.
|
||||||
|
//
|
||||||
|
// It specifically is NOT necessarily using chunk sizes communicated in a
|
||||||
|
// previous Stat request.
|
||||||
|
//
|
||||||
|
// It's up to the specific store to decide on whether it allows Read on a
|
||||||
|
// Blob at all, or only on smaller chunks communicated in a Stat() call
|
||||||
|
// first.
|
||||||
|
//
|
||||||
|
// Clients are enouraged to Stat() first, and then only read the individual
|
||||||
|
// chunks they don't have yet.
|
||||||
rpc Read(ReadBlobRequest) returns (stream BlobChunk);
|
rpc Read(ReadBlobRequest) returns (stream BlobChunk);
|
||||||
|
|
||||||
// Put uploads a Blob, by reading a stream of bytes.
|
// Put uploads a Blob, by reading a stream of bytes.
|
||||||
|
//
|
||||||
|
// The way the data is chunked up in individual BlobChunk messages sent in
|
||||||
|
// the stream has no effect on how the server ends up chunking blobs up.
|
||||||
rpc Put(stream BlobChunk) returns (PutBlobResponse);
|
rpc Put(stream BlobChunk) returns (PutBlobResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +73,7 @@ message BlobMeta {
|
||||||
}
|
}
|
||||||
|
|
||||||
message ReadBlobRequest {
|
message ReadBlobRequest {
|
||||||
// The blake3 digest of the blob requested
|
// The blake3 digest of the blob or chunk requested
|
||||||
bytes digest = 1;
|
bytes digest = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,26 @@ type BlobServiceClient interface {
|
||||||
// If there's no more granular chunking available, the response will simply
|
// If there's no more granular chunking available, the response will simply
|
||||||
// contain a single chunk.
|
// contain a single chunk.
|
||||||
Stat(ctx context.Context, in *StatBlobRequest, opts ...grpc.CallOption) (*BlobMeta, error)
|
Stat(ctx context.Context, in *StatBlobRequest, opts ...grpc.CallOption) (*BlobMeta, error)
|
||||||
// Read returns a stream of BlobChunk, which is just a stream of bytes - not necessarily
|
// Read returns a stream of BlobChunk, which is just a stream of bytes with
|
||||||
// using the chunking that's returned in the reply of a Stat() call.
|
// the digest specified in ReadBlobRequest.
|
||||||
|
//
|
||||||
|
// The server may decide on whatever chunking it may seem fit as a size for
|
||||||
|
// the individual BlobChunk sent in the response stream.
|
||||||
|
//
|
||||||
|
// It specifically is NOT necessarily using chunk sizes communicated in a
|
||||||
|
// previous Stat request.
|
||||||
|
//
|
||||||
|
// It's up to the specific store to decide on whether it allows Read on a
|
||||||
|
// Blob at all, or only on smaller chunks communicated in a Stat() call
|
||||||
|
// first.
|
||||||
|
//
|
||||||
|
// Clients are enouraged to Stat() first, and then only read the individual
|
||||||
|
// chunks they don't have yet.
|
||||||
Read(ctx context.Context, in *ReadBlobRequest, opts ...grpc.CallOption) (BlobService_ReadClient, error)
|
Read(ctx context.Context, in *ReadBlobRequest, opts ...grpc.CallOption) (BlobService_ReadClient, error)
|
||||||
// Put uploads a Blob, by reading a stream of bytes.
|
// Put uploads a Blob, by reading a stream of bytes.
|
||||||
|
//
|
||||||
|
// The way the data is chunked up in individual BlobChunk messages sent in
|
||||||
|
// the stream has no effect on how the server ends up chunking blobs up.
|
||||||
Put(ctx context.Context, opts ...grpc.CallOption) (BlobService_PutClient, error)
|
Put(ctx context.Context, opts ...grpc.CallOption) (BlobService_PutClient, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,10 +146,26 @@ type BlobServiceServer interface {
|
||||||
// If there's no more granular chunking available, the response will simply
|
// If there's no more granular chunking available, the response will simply
|
||||||
// contain a single chunk.
|
// contain a single chunk.
|
||||||
Stat(context.Context, *StatBlobRequest) (*BlobMeta, error)
|
Stat(context.Context, *StatBlobRequest) (*BlobMeta, error)
|
||||||
// Read returns a stream of BlobChunk, which is just a stream of bytes - not necessarily
|
// Read returns a stream of BlobChunk, which is just a stream of bytes with
|
||||||
// using the chunking that's returned in the reply of a Stat() call.
|
// the digest specified in ReadBlobRequest.
|
||||||
|
//
|
||||||
|
// The server may decide on whatever chunking it may seem fit as a size for
|
||||||
|
// the individual BlobChunk sent in the response stream.
|
||||||
|
//
|
||||||
|
// It specifically is NOT necessarily using chunk sizes communicated in a
|
||||||
|
// previous Stat request.
|
||||||
|
//
|
||||||
|
// It's up to the specific store to decide on whether it allows Read on a
|
||||||
|
// Blob at all, or only on smaller chunks communicated in a Stat() call
|
||||||
|
// first.
|
||||||
|
//
|
||||||
|
// Clients are enouraged to Stat() first, and then only read the individual
|
||||||
|
// chunks they don't have yet.
|
||||||
Read(*ReadBlobRequest, BlobService_ReadServer) error
|
Read(*ReadBlobRequest, BlobService_ReadServer) error
|
||||||
// Put uploads a Blob, by reading a stream of bytes.
|
// Put uploads a Blob, by reading a stream of bytes.
|
||||||
|
//
|
||||||
|
// The way the data is chunked up in individual BlobChunk messages sent in
|
||||||
|
// the stream has no effect on how the server ends up chunking blobs up.
|
||||||
Put(BlobService_PutServer) error
|
Put(BlobService_PutServer) error
|
||||||
mustEmbedUnimplementedBlobServiceServer()
|
mustEmbedUnimplementedBlobServiceServer()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue