From 34e4e2d6cfd428d6e64cb63959b6de2ae3b496f2 Mon Sep 17 00:00:00 2001 From: Tyler French Date: Mon, 18 May 2026 10:17:42 -0400 Subject: [PATCH 1/2] feat: Support streaming versions of split/splice for very large blobs --- .../execution/v2/remote_execution.pb.go | 559 ++++++++++++------ .../execution/v2/remote_execution.proto | 145 +++++ .../execution/v2/remote_execution_grpc.pb.go | 218 +++++++ 3 files changed, 743 insertions(+), 179 deletions(-) diff --git a/build/bazel/remote/execution/v2/remote_execution.pb.go b/build/bazel/remote/execution/v2/remote_execution.pb.go index b8fcd77d..5d153021 100755 --- a/build/bazel/remote/execution/v2/remote_execution.pb.go +++ b/build/bazel/remote/execution/v2/remote_execution.pb.go @@ -303,7 +303,7 @@ func (x DigestFunction_Value) Number() protoreflect.EnumNumber { // Deprecated: Use DigestFunction_Value.Descriptor instead. func (DigestFunction_Value) EnumDescriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{40, 0} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{42, 0} } type ChunkingFunction_Value int32 @@ -360,7 +360,7 @@ func (x ChunkingFunction_Value) Number() protoreflect.EnumNumber { // Deprecated: Use ChunkingFunction_Value.Descriptor instead. func (ChunkingFunction_Value) EnumDescriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{41, 0} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{43, 0} } type SymlinkAbsolutePathStrategy_Value int32 @@ -416,7 +416,7 @@ func (x SymlinkAbsolutePathStrategy_Value) Number() protoreflect.EnumNumber { // Deprecated: Use SymlinkAbsolutePathStrategy_Value.Descriptor instead. func (SymlinkAbsolutePathStrategy_Value) EnumDescriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{44, 0} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{46, 0} } type Compressor_Value int32 @@ -478,7 +478,7 @@ func (x Compressor_Value) Number() protoreflect.EnumNumber { // Deprecated: Use Compressor_Value.Descriptor instead. func (Compressor_Value) EnumDescriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{45, 0} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{47, 0} } // An `Action` captures all the information about an execution which is required @@ -3820,6 +3820,73 @@ func (x *SplitBlobResponse) GetChunkingFunction() ChunkingFunction_Value { return ChunkingFunction_UNKNOWN } +// A response message for +// [ContentAddressableStorage.SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks]. +type SplitChunksResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The ordered list of digests of the chunks into which the blob was split. + // The original blob is assembled by concatenating the chunk data according to + // the order of the digests in this field, across all responses in stream + // order. + // + // Servers SHOULD limit the number of digests in each response to remain below + // the maximum message size accepted by the client/server pair. + // + // The server MUST use the same digest function as the one explicitly or + // implicitly (through hash length) specified in the split request. + ChunkDigests []*Digest `protobuf:"bytes,1,rep,name=chunk_digests,json=chunkDigests,proto3" json:"chunk_digests,omitempty"` + // The chunking function used to split the blob. Clients MUST use the value + // from the first response and ignore values sent on subsequent responses. + // Servers SHOULD omit this field on subsequent responses. + ChunkingFunction ChunkingFunction_Value `protobuf:"varint,2,opt,name=chunking_function,json=chunkingFunction,proto3,enum=build.bazel.remote.execution.v2.ChunkingFunction_Value" json:"chunking_function,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SplitChunksResponse) Reset() { + *x = SplitChunksResponse{} + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SplitChunksResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SplitChunksResponse) ProtoMessage() {} + +func (x *SplitChunksResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SplitChunksResponse.ProtoReflect.Descriptor instead. +func (*SplitChunksResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{36} +} + +func (x *SplitChunksResponse) GetChunkDigests() []*Digest { + if x != nil { + return x.ChunkDigests + } + return nil +} + +func (x *SplitChunksResponse) GetChunkingFunction() ChunkingFunction_Value { + if x != nil { + return x.ChunkingFunction + } + return ChunkingFunction_UNKNOWN +} + // A request message for // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob]. type SpliceBlobRequest struct { @@ -3862,7 +3929,7 @@ type SpliceBlobRequest struct { func (x *SpliceBlobRequest) Reset() { *x = SpliceBlobRequest{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3874,7 +3941,7 @@ func (x *SpliceBlobRequest) String() string { func (*SpliceBlobRequest) ProtoMessage() {} func (x *SpliceBlobRequest) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3887,7 +3954,7 @@ func (x *SpliceBlobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SpliceBlobRequest.ProtoReflect.Descriptor instead. func (*SpliceBlobRequest) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{36} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{37} } func (x *SpliceBlobRequest) GetInstanceName() string { @@ -3925,6 +3992,112 @@ func (x *SpliceBlobRequest) GetChunkingFunction() ChunkingFunction_Value { return ChunkingFunction_UNKNOWN } +// A request message for +// [ContentAddressableStorage.SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks]. +type SpliceChunksRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. Servers MUST use the value from the first request and ignore + // values sent on subsequent requests. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // Expected digest of the spliced blob. Clients MUST set this on the first + // request. Servers MUST use the value from the first request and ignore values + // sent on subsequent requests. + BlobDigest *Digest `protobuf:"bytes,2,opt,name=blob_digest,json=blobDigest,proto3" json:"blob_digest,omitempty"` + // The ordered list of digests of the chunks which need to be concatenated to + // assemble the original blob. Chunk digests may be split across multiple + // stream requests. The original blob is assembled by concatenating chunks in + // the order of these digests across all requests in stream order. + // + // Clients SHOULD limit the number of digests in each request to remain below + // the maximum message size accepted by the client/server pair. + ChunkDigests []*Digest `protobuf:"bytes,3,rep,name=chunk_digests,json=chunkDigests,proto3" json:"chunk_digests,omitempty"` + // The digest function of all chunks to be concatenated and of the blob to be + // spliced. The server MUST use the same digest function for both cases. + // Servers MUST use the value from the first request and ignore values sent on + // subsequent requests. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, SHA384, + // SHA512, or VSO, the client MAY leave this field unset. In that case the + // server SHOULD infer the digest function using the length of the blob digest + // hashes and the digest functions announced in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,4,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` + // The chunking function that the client used to split the blob. Servers MUST + // use the value from the first request and ignore values sent on subsequent + // requests. + ChunkingFunction ChunkingFunction_Value `protobuf:"varint,5,opt,name=chunking_function,json=chunkingFunction,proto3,enum=build.bazel.remote.execution.v2.ChunkingFunction_Value" json:"chunking_function,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpliceChunksRequest) Reset() { + *x = SpliceChunksRequest{} + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpliceChunksRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpliceChunksRequest) ProtoMessage() {} + +func (x *SpliceChunksRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpliceChunksRequest.ProtoReflect.Descriptor instead. +func (*SpliceChunksRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{38} +} + +func (x *SpliceChunksRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *SpliceChunksRequest) GetBlobDigest() *Digest { + if x != nil { + return x.BlobDigest + } + return nil +} + +func (x *SpliceChunksRequest) GetChunkDigests() []*Digest { + if x != nil { + return x.ChunkDigests + } + return nil +} + +func (x *SpliceChunksRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +func (x *SpliceChunksRequest) GetChunkingFunction() ChunkingFunction_Value { + if x != nil { + return x.ChunkingFunction + } + return ChunkingFunction_UNKNOWN +} + // A response message for // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob]. type SpliceBlobResponse struct { @@ -3940,7 +4113,7 @@ type SpliceBlobResponse struct { func (x *SpliceBlobResponse) Reset() { *x = SpliceBlobResponse{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3952,7 +4125,7 @@ func (x *SpliceBlobResponse) String() string { func (*SpliceBlobResponse) ProtoMessage() {} func (x *SpliceBlobResponse) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3965,7 +4138,7 @@ func (x *SpliceBlobResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SpliceBlobResponse.ProtoReflect.Descriptor instead. func (*SpliceBlobResponse) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{37} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{39} } func (x *SpliceBlobResponse) GetBlobDigest() *Digest { @@ -3991,7 +4164,7 @@ type GetCapabilitiesRequest struct { func (x *GetCapabilitiesRequest) Reset() { *x = GetCapabilitiesRequest{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4003,7 +4176,7 @@ func (x *GetCapabilitiesRequest) String() string { func (*GetCapabilitiesRequest) ProtoMessage() {} func (x *GetCapabilitiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4016,7 +4189,7 @@ func (x *GetCapabilitiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCapabilitiesRequest.ProtoReflect.Descriptor instead. func (*GetCapabilitiesRequest) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{38} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{40} } func (x *GetCapabilitiesRequest) GetInstanceName() string { @@ -4046,7 +4219,7 @@ type ServerCapabilities struct { func (x *ServerCapabilities) Reset() { *x = ServerCapabilities{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4058,7 +4231,7 @@ func (x *ServerCapabilities) String() string { func (*ServerCapabilities) ProtoMessage() {} func (x *ServerCapabilities) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4071,7 +4244,7 @@ func (x *ServerCapabilities) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerCapabilities.ProtoReflect.Descriptor instead. func (*ServerCapabilities) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{39} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{41} } func (x *ServerCapabilities) GetCacheCapabilities() *CacheCapabilities { @@ -4119,7 +4292,7 @@ type DigestFunction struct { func (x *DigestFunction) Reset() { *x = DigestFunction{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4131,7 +4304,7 @@ func (x *DigestFunction) String() string { func (*DigestFunction) ProtoMessage() {} func (x *DigestFunction) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4144,7 +4317,7 @@ func (x *DigestFunction) ProtoReflect() protoreflect.Message { // Deprecated: Use DigestFunction.ProtoReflect.Descriptor instead. func (*DigestFunction) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{40} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{42} } // The chunking function is used to split a blob into chunks. @@ -4165,7 +4338,7 @@ type ChunkingFunction struct { func (x *ChunkingFunction) Reset() { *x = ChunkingFunction{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4177,7 +4350,7 @@ func (x *ChunkingFunction) String() string { func (*ChunkingFunction) ProtoMessage() {} func (x *ChunkingFunction) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4190,7 +4363,7 @@ func (x *ChunkingFunction) ProtoReflect() protoreflect.Message { // Deprecated: Use ChunkingFunction.ProtoReflect.Descriptor instead. func (*ChunkingFunction) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{41} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{43} } // Describes the server/instance capabilities for updating the action cache. @@ -4203,7 +4376,7 @@ type ActionCacheUpdateCapabilities struct { func (x *ActionCacheUpdateCapabilities) Reset() { *x = ActionCacheUpdateCapabilities{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4215,7 +4388,7 @@ func (x *ActionCacheUpdateCapabilities) String() string { func (*ActionCacheUpdateCapabilities) ProtoMessage() {} func (x *ActionCacheUpdateCapabilities) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4228,7 +4401,7 @@ func (x *ActionCacheUpdateCapabilities) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionCacheUpdateCapabilities.ProtoReflect.Descriptor instead. func (*ActionCacheUpdateCapabilities) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{42} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{44} } func (x *ActionCacheUpdateCapabilities) GetUpdateEnabled() bool { @@ -4251,7 +4424,7 @@ type PriorityCapabilities struct { func (x *PriorityCapabilities) Reset() { *x = PriorityCapabilities{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4263,7 +4436,7 @@ func (x *PriorityCapabilities) String() string { func (*PriorityCapabilities) ProtoMessage() {} func (x *PriorityCapabilities) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4276,7 +4449,7 @@ func (x *PriorityCapabilities) ProtoReflect() protoreflect.Message { // Deprecated: Use PriorityCapabilities.ProtoReflect.Descriptor instead. func (*PriorityCapabilities) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{43} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{45} } func (x *PriorityCapabilities) GetPriorities() []*PriorityCapabilities_PriorityRange { @@ -4295,7 +4468,7 @@ type SymlinkAbsolutePathStrategy struct { func (x *SymlinkAbsolutePathStrategy) Reset() { *x = SymlinkAbsolutePathStrategy{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4307,7 +4480,7 @@ func (x *SymlinkAbsolutePathStrategy) String() string { func (*SymlinkAbsolutePathStrategy) ProtoMessage() {} func (x *SymlinkAbsolutePathStrategy) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4320,7 +4493,7 @@ func (x *SymlinkAbsolutePathStrategy) ProtoReflect() protoreflect.Message { // Deprecated: Use SymlinkAbsolutePathStrategy.ProtoReflect.Descriptor instead. func (*SymlinkAbsolutePathStrategy) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{44} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{46} } // Compression formats which may be supported. @@ -4332,7 +4505,7 @@ type Compressor struct { func (x *Compressor) Reset() { *x = Compressor{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4344,7 +4517,7 @@ func (x *Compressor) String() string { func (*Compressor) ProtoMessage() {} func (x *Compressor) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4357,7 +4530,7 @@ func (x *Compressor) ProtoReflect() protoreflect.Message { // Deprecated: Use Compressor.ProtoReflect.Descriptor instead. func (*Compressor) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{45} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{47} } // Capabilities of the remote cache system. @@ -4402,12 +4575,16 @@ type CacheCapabilities struct { // yes, the server/instance implements the specified behavior for blob // splitting and a meaningful result can be expected from the // [ContentAddressableStorage.SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // operation. Starting in RE API v2.13, this also includes the + // [ContentAddressableStorage.SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // operation. SplitBlobSupport bool `protobuf:"varint,9,opt,name=split_blob_support,json=splitBlobSupport,proto3" json:"split_blob_support,omitempty"` // Whether blob splicing is supported for the particular server/instance. If // yes, the server/instance implements the specified behavior for blob // splicing and a meaningful result can be expected from the // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob] + // operation. Starting in RE API v2.13, this also includes the + // [ContentAddressableStorage.SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks] // operation. SpliceBlobSupport bool `protobuf:"varint,10,opt,name=splice_blob_support,json=spliceBlobSupport,proto3" json:"splice_blob_support,omitempty"` // The parameters for the FastCDC 2020 chunking algorithm. @@ -4422,7 +4599,7 @@ type CacheCapabilities struct { func (x *CacheCapabilities) Reset() { *x = CacheCapabilities{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4434,7 +4611,7 @@ func (x *CacheCapabilities) String() string { func (*CacheCapabilities) ProtoMessage() {} func (x *CacheCapabilities) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4447,7 +4624,7 @@ func (x *CacheCapabilities) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheCapabilities.ProtoReflect.Descriptor instead. func (*CacheCapabilities) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{46} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{48} } func (x *CacheCapabilities) GetDigestFunctions() []DigestFunction_Value { @@ -4585,7 +4762,7 @@ type FastCdc2020Params struct { func (x *FastCdc2020Params) Reset() { *x = FastCdc2020Params{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[47] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4597,7 +4774,7 @@ func (x *FastCdc2020Params) String() string { func (*FastCdc2020Params) ProtoMessage() {} func (x *FastCdc2020Params) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[47] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4610,7 +4787,7 @@ func (x *FastCdc2020Params) ProtoReflect() protoreflect.Message { // Deprecated: Use FastCdc2020Params.ProtoReflect.Descriptor instead. func (*FastCdc2020Params) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{47} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{49} } func (x *FastCdc2020Params) GetAvgChunkSizeBytes() uint64 { @@ -4668,7 +4845,7 @@ type RepMaxCdcParams struct { func (x *RepMaxCdcParams) Reset() { *x = RepMaxCdcParams{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4680,7 +4857,7 @@ func (x *RepMaxCdcParams) String() string { func (*RepMaxCdcParams) ProtoMessage() {} func (x *RepMaxCdcParams) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4693,7 +4870,7 @@ func (x *RepMaxCdcParams) ProtoReflect() protoreflect.Message { // Deprecated: Use RepMaxCdcParams.ProtoReflect.Descriptor instead. func (*RepMaxCdcParams) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{48} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{50} } func (x *RepMaxCdcParams) GetMinChunkSizeBytes() uint64 { @@ -4743,7 +4920,7 @@ type ExecutionCapabilities struct { func (x *ExecutionCapabilities) Reset() { *x = ExecutionCapabilities{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4755,7 +4932,7 @@ func (x *ExecutionCapabilities) String() string { func (*ExecutionCapabilities) ProtoMessage() {} func (x *ExecutionCapabilities) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4768,7 +4945,7 @@ func (x *ExecutionCapabilities) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecutionCapabilities.ProtoReflect.Descriptor instead. func (*ExecutionCapabilities) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{49} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{51} } func (x *ExecutionCapabilities) GetDigestFunction() DigestFunction_Value { @@ -4819,7 +4996,7 @@ type ToolDetails struct { func (x *ToolDetails) Reset() { *x = ToolDetails{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4831,7 +5008,7 @@ func (x *ToolDetails) String() string { func (*ToolDetails) ProtoMessage() {} func (x *ToolDetails) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4844,7 +5021,7 @@ func (x *ToolDetails) ProtoReflect() protoreflect.Message { // Deprecated: Use ToolDetails.ProtoReflect.Descriptor instead. func (*ToolDetails) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{50} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{52} } func (x *ToolDetails) GetToolName() string { @@ -4904,7 +5081,7 @@ type RequestMetadata struct { func (x *RequestMetadata) Reset() { *x = RequestMetadata{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4916,7 +5093,7 @@ func (x *RequestMetadata) String() string { func (*RequestMetadata) ProtoMessage() {} func (x *RequestMetadata) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4929,7 +5106,7 @@ func (x *RequestMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestMetadata.ProtoReflect.Descriptor instead. func (*RequestMetadata) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{51} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{53} } func (x *RequestMetadata) GetToolDetails() *ToolDetails { @@ -4995,7 +5172,7 @@ type Command_EnvironmentVariable struct { func (x *Command_EnvironmentVariable) Reset() { *x = Command_EnvironmentVariable{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[52] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5007,7 +5184,7 @@ func (x *Command_EnvironmentVariable) String() string { func (*Command_EnvironmentVariable) ProtoMessage() {} func (x *Command_EnvironmentVariable) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[52] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5071,7 +5248,7 @@ type Platform_Property struct { func (x *Platform_Property) Reset() { *x = Platform_Property{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[53] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5083,7 +5260,7 @@ func (x *Platform_Property) String() string { func (*Platform_Property) ProtoMessage() {} func (x *Platform_Property) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[53] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5132,7 +5309,7 @@ type BatchUpdateBlobsRequest_Request struct { func (x *BatchUpdateBlobsRequest_Request) Reset() { *x = BatchUpdateBlobsRequest_Request{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[55] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5144,7 +5321,7 @@ func (x *BatchUpdateBlobsRequest_Request) String() string { func (*BatchUpdateBlobsRequest_Request) ProtoMessage() {} func (x *BatchUpdateBlobsRequest_Request) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[55] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5194,7 +5371,7 @@ type BatchUpdateBlobsResponse_Response struct { func (x *BatchUpdateBlobsResponse_Response) Reset() { *x = BatchUpdateBlobsResponse_Response{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[56] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5206,7 +5383,7 @@ func (x *BatchUpdateBlobsResponse_Response) String() string { func (*BatchUpdateBlobsResponse_Response) ProtoMessage() {} func (x *BatchUpdateBlobsResponse_Response) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[56] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5254,7 +5431,7 @@ type BatchReadBlobsResponse_Response struct { func (x *BatchReadBlobsResponse_Response) Reset() { *x = BatchReadBlobsResponse_Response{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[57] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5266,7 +5443,7 @@ func (x *BatchReadBlobsResponse_Response) String() string { func (*BatchReadBlobsResponse_Response) ProtoMessage() {} func (x *BatchReadBlobsResponse_Response) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[57] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5325,7 +5502,7 @@ type PriorityCapabilities_PriorityRange struct { func (x *PriorityCapabilities_PriorityRange) Reset() { *x = PriorityCapabilities_PriorityRange{} - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[58] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5337,7 +5514,7 @@ func (x *PriorityCapabilities_PriorityRange) String() string { func (*PriorityCapabilities_PriorityRange) ProtoMessage() {} func (x *PriorityCapabilities_PriorityRange) ProtoReflect() protoreflect.Message { - mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[58] + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5350,7 +5527,7 @@ func (x *PriorityCapabilities_PriorityRange) ProtoReflect() protoreflect.Message // Deprecated: Use PriorityCapabilities_PriorityRange.ProtoReflect.Descriptor instead. func (*PriorityCapabilities_PriorityRange) Descriptor() ([]byte, []int) { - return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{43, 0} + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{45, 0} } func (x *PriorityCapabilities_PriorityRange) GetMinPriority() int32 { @@ -5596,6 +5773,9 @@ const file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc = "" + "\x11chunking_function\x18\x04 \x01(\x0e27.build.bazel.remote.execution.v2.ChunkingFunction.ValueR\x10chunkingFunction\"\xc7\x01\n" + "\x11SplitBlobResponse\x12L\n" + "\rchunk_digests\x18\x01 \x03(\v2'.build.bazel.remote.execution.v2.DigestR\fchunkDigests\x12d\n" + + "\x11chunking_function\x18\x02 \x01(\x0e27.build.bazel.remote.execution.v2.ChunkingFunction.ValueR\x10chunkingFunction\"\xc9\x01\n" + + "\x13SplitChunksResponse\x12L\n" + + "\rchunk_digests\x18\x01 \x03(\v2'.build.bazel.remote.execution.v2.DigestR\fchunkDigests\x12d\n" + "\x11chunking_function\x18\x02 \x01(\x0e27.build.bazel.remote.execution.v2.ChunkingFunction.ValueR\x10chunkingFunction\"\x96\x03\n" + "\x11SpliceBlobRequest\x12#\n" + "\rinstance_name\x18\x01 \x01(\tR\finstanceName\x12H\n" + @@ -5603,6 +5783,13 @@ const file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc = "" + "blobDigest\x12L\n" + "\rchunk_digests\x18\x03 \x03(\v2'.build.bazel.remote.execution.v2.DigestR\fchunkDigests\x12^\n" + "\x0fdigest_function\x18\x04 \x01(\x0e25.build.bazel.remote.execution.v2.DigestFunction.ValueR\x0edigestFunction\x12d\n" + + "\x11chunking_function\x18\x05 \x01(\x0e27.build.bazel.remote.execution.v2.ChunkingFunction.ValueR\x10chunkingFunction\"\x98\x03\n" + + "\x13SpliceChunksRequest\x12#\n" + + "\rinstance_name\x18\x01 \x01(\tR\finstanceName\x12H\n" + + "\vblob_digest\x18\x02 \x01(\v2'.build.bazel.remote.execution.v2.DigestR\n" + + "blobDigest\x12L\n" + + "\rchunk_digests\x18\x03 \x03(\v2'.build.bazel.remote.execution.v2.DigestR\fchunkDigests\x12^\n" + + "\x0fdigest_function\x18\x04 \x01(\x0e25.build.bazel.remote.execution.v2.DigestFunction.ValueR\x0edigestFunction\x12d\n" + "\x11chunking_function\x18\x05 \x01(\x0e27.build.bazel.remote.execution.v2.ChunkingFunction.ValueR\x10chunkingFunction\"^\n" + "\x12SpliceBlobResponse\x12H\n" + "\vblob_digest\x18\x01 \x01(\v2'.build.bazel.remote.execution.v2.DigestR\n" + @@ -5704,15 +5891,17 @@ const file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc = "" + "\rWaitExecution\x125.build.bazel.remote.execution.v2.WaitExecutionRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+:\x01*\"&/v2/{name=operations/**}:waitExecution0\x012\xd6\x03\n" + "\vActionCache\x12\xd7\x01\n" + "\x0fGetActionResult\x127.build.bazel.remote.execution.v2.GetActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"\\\x82\xd3\xe4\x93\x02V\x12T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}\x12\xec\x01\n" + - "\x12UpdateActionResult\x12:.build.bazel.remote.execution.v2.UpdateActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"k\x82\xd3\xe4\x93\x02e:\raction_result\x1aT/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}2\x98\t\n" + + "\x12UpdateActionResult\x12:.build.bazel.remote.execution.v2.UpdateActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"k\x82\xd3\xe4\x93\x02e:\raction_result\x1aT/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}2\x8f\v\n" + "\x19ContentAddressableStorage\x12\xbc\x01\n" + "\x10FindMissingBlobs\x128.build.bazel.remote.execution.v2.FindMissingBlobsRequest\x1a9.build.bazel.remote.execution.v2.FindMissingBlobsResponse\"3\x82\xd3\xe4\x93\x02-:\x01*\"(/v2/{instance_name=**}/blobs:findMissing\x12\xbc\x01\n" + "\x10BatchUpdateBlobs\x128.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest\x1a9.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse\"3\x82\xd3\xe4\x93\x02-:\x01*\"(/v2/{instance_name=**}/blobs:batchUpdate\x12\xb4\x01\n" + "\x0eBatchReadBlobs\x126.build.bazel.remote.execution.v2.BatchReadBlobsRequest\x1a7.build.bazel.remote.execution.v2.BatchReadBlobsResponse\"1\x82\xd3\xe4\x93\x02+:\x01*\"&/v2/{instance_name=**}/blobs:batchRead\x12\xc8\x01\n" + "\aGetTree\x12/.build.bazel.remote.execution.v2.GetTreeRequest\x1a0.build.bazel.remote.execution.v2.GetTreeResponse\"X\x82\xd3\xe4\x93\x02R\x12P/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree0\x01\x12\xce\x01\n" + - "\tSplitBlob\x121.build.bazel.remote.execution.v2.SplitBlobRequest\x1a2.build.bazel.remote.execution.v2.SplitBlobResponse\"Z\x82\xd3\xe4\x93\x02T\x12R/v2/{instance_name=**}/blobs/{blob_digest.hash}/{blob_digest.size_bytes}:splitBlob\x12\xa9\x01\n" + + "\tSplitBlob\x121.build.bazel.remote.execution.v2.SplitBlobRequest\x1a2.build.bazel.remote.execution.v2.SplitBlobResponse\"Z\x82\xd3\xe4\x93\x02T\x12R/v2/{instance_name=**}/blobs/{blob_digest.hash}/{blob_digest.size_bytes}:splitBlob\x12x\n" + + "\vSplitChunks\x121.build.bazel.remote.execution.v2.SplitBlobRequest\x1a4.build.bazel.remote.execution.v2.SplitChunksResponse0\x01\x12\xa9\x01\n" + "\n" + - "SpliceBlob\x122.build.bazel.remote.execution.v2.SpliceBlobRequest\x1a3.build.bazel.remote.execution.v2.SpliceBlobResponse\"2\x82\xd3\xe4\x93\x02,:\x01*\"'/v2/{instance_name=**}/blobs:spliceBlob2\xbd\x01\n" + + "SpliceBlob\x122.build.bazel.remote.execution.v2.SpliceBlobRequest\x1a3.build.bazel.remote.execution.v2.SpliceBlobResponse\"2\x82\xd3\xe4\x93\x02,:\x01*\"'/v2/{instance_name=**}/blobs:spliceBlob\x12{\n" + + "\fSpliceChunks\x124.build.bazel.remote.execution.v2.SpliceChunksRequest\x1a3.build.bazel.remote.execution.v2.SpliceBlobResponse(\x012\xbd\x01\n" + "\fCapabilities\x12\xac\x01\n" + "\x0fGetCapabilities\x127.build.bazel.remote.execution.v2.GetCapabilitiesRequest\x1a3.build.bazel.remote.execution.v2.ServerCapabilities\"+\x82\xd3\xe4\x93\x02%\x12#/v2/{instance_name=**}/capabilitiesB\xb4\x01\n" + "\x1fbuild.bazel.remote.execution.v2B\x14RemoteExecutionProtoP\x01ZQgithub.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2;remoteexecution\xa2\x02\x03REX\xaa\x02\x1fBuild.Bazel.Remote.Execution.V2b\x06proto3" @@ -5730,7 +5919,7 @@ func file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP() [ } var file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes = make([]protoimpl.MessageInfo, 59) +var file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes = make([]protoimpl.MessageInfo, 61) var file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes = []any{ (Command_OutputDirectoryFormat)(0), // 0: build.bazel.remote.execution.v2.Command.OutputDirectoryFormat (ExecutionStage_Value)(0), // 1: build.bazel.remote.execution.v2.ExecutionStage.Value @@ -5774,68 +5963,70 @@ var file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes = []any{ (*GetTreeResponse)(nil), // 39: build.bazel.remote.execution.v2.GetTreeResponse (*SplitBlobRequest)(nil), // 40: build.bazel.remote.execution.v2.SplitBlobRequest (*SplitBlobResponse)(nil), // 41: build.bazel.remote.execution.v2.SplitBlobResponse - (*SpliceBlobRequest)(nil), // 42: build.bazel.remote.execution.v2.SpliceBlobRequest - (*SpliceBlobResponse)(nil), // 43: build.bazel.remote.execution.v2.SpliceBlobResponse - (*GetCapabilitiesRequest)(nil), // 44: build.bazel.remote.execution.v2.GetCapabilitiesRequest - (*ServerCapabilities)(nil), // 45: build.bazel.remote.execution.v2.ServerCapabilities - (*DigestFunction)(nil), // 46: build.bazel.remote.execution.v2.DigestFunction - (*ChunkingFunction)(nil), // 47: build.bazel.remote.execution.v2.ChunkingFunction - (*ActionCacheUpdateCapabilities)(nil), // 48: build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities - (*PriorityCapabilities)(nil), // 49: build.bazel.remote.execution.v2.PriorityCapabilities - (*SymlinkAbsolutePathStrategy)(nil), // 50: build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy - (*Compressor)(nil), // 51: build.bazel.remote.execution.v2.Compressor - (*CacheCapabilities)(nil), // 52: build.bazel.remote.execution.v2.CacheCapabilities - (*FastCdc2020Params)(nil), // 53: build.bazel.remote.execution.v2.FastCdc2020Params - (*RepMaxCdcParams)(nil), // 54: build.bazel.remote.execution.v2.RepMaxCdcParams - (*ExecutionCapabilities)(nil), // 55: build.bazel.remote.execution.v2.ExecutionCapabilities - (*ToolDetails)(nil), // 56: build.bazel.remote.execution.v2.ToolDetails - (*RequestMetadata)(nil), // 57: build.bazel.remote.execution.v2.RequestMetadata - (*Command_EnvironmentVariable)(nil), // 58: build.bazel.remote.execution.v2.Command.EnvironmentVariable - (*Platform_Property)(nil), // 59: build.bazel.remote.execution.v2.Platform.Property - nil, // 60: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry - (*BatchUpdateBlobsRequest_Request)(nil), // 61: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request - (*BatchUpdateBlobsResponse_Response)(nil), // 62: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response - (*BatchReadBlobsResponse_Response)(nil), // 63: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response - (*PriorityCapabilities_PriorityRange)(nil), // 64: build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange - (*durationpb.Duration)(nil), // 65: google.protobuf.Duration - (*timestamppb.Timestamp)(nil), // 66: google.protobuf.Timestamp - (*wrapperspb.UInt32Value)(nil), // 67: google.protobuf.UInt32Value - (*anypb.Any)(nil), // 68: google.protobuf.Any - (*status.Status)(nil), // 69: google.rpc.Status - (*semver.SemVer)(nil), // 70: build.bazel.semver.SemVer - (*longrunningpb.Operation)(nil), // 71: google.longrunning.Operation + (*SplitChunksResponse)(nil), // 42: build.bazel.remote.execution.v2.SplitChunksResponse + (*SpliceBlobRequest)(nil), // 43: build.bazel.remote.execution.v2.SpliceBlobRequest + (*SpliceChunksRequest)(nil), // 44: build.bazel.remote.execution.v2.SpliceChunksRequest + (*SpliceBlobResponse)(nil), // 45: build.bazel.remote.execution.v2.SpliceBlobResponse + (*GetCapabilitiesRequest)(nil), // 46: build.bazel.remote.execution.v2.GetCapabilitiesRequest + (*ServerCapabilities)(nil), // 47: build.bazel.remote.execution.v2.ServerCapabilities + (*DigestFunction)(nil), // 48: build.bazel.remote.execution.v2.DigestFunction + (*ChunkingFunction)(nil), // 49: build.bazel.remote.execution.v2.ChunkingFunction + (*ActionCacheUpdateCapabilities)(nil), // 50: build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities + (*PriorityCapabilities)(nil), // 51: build.bazel.remote.execution.v2.PriorityCapabilities + (*SymlinkAbsolutePathStrategy)(nil), // 52: build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy + (*Compressor)(nil), // 53: build.bazel.remote.execution.v2.Compressor + (*CacheCapabilities)(nil), // 54: build.bazel.remote.execution.v2.CacheCapabilities + (*FastCdc2020Params)(nil), // 55: build.bazel.remote.execution.v2.FastCdc2020Params + (*RepMaxCdcParams)(nil), // 56: build.bazel.remote.execution.v2.RepMaxCdcParams + (*ExecutionCapabilities)(nil), // 57: build.bazel.remote.execution.v2.ExecutionCapabilities + (*ToolDetails)(nil), // 58: build.bazel.remote.execution.v2.ToolDetails + (*RequestMetadata)(nil), // 59: build.bazel.remote.execution.v2.RequestMetadata + (*Command_EnvironmentVariable)(nil), // 60: build.bazel.remote.execution.v2.Command.EnvironmentVariable + (*Platform_Property)(nil), // 61: build.bazel.remote.execution.v2.Platform.Property + nil, // 62: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry + (*BatchUpdateBlobsRequest_Request)(nil), // 63: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request + (*BatchUpdateBlobsResponse_Response)(nil), // 64: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response + (*BatchReadBlobsResponse_Response)(nil), // 65: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response + (*PriorityCapabilities_PriorityRange)(nil), // 66: build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange + (*durationpb.Duration)(nil), // 67: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 68: google.protobuf.Timestamp + (*wrapperspb.UInt32Value)(nil), // 69: google.protobuf.UInt32Value + (*anypb.Any)(nil), // 70: google.protobuf.Any + (*status.Status)(nil), // 71: google.rpc.Status + (*semver.SemVer)(nil), // 72: build.bazel.semver.SemVer + (*longrunningpb.Operation)(nil), // 73: google.longrunning.Operation } var file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = []int32{ 15, // 0: build.bazel.remote.execution.v2.Action.command_digest:type_name -> build.bazel.remote.execution.v2.Digest 15, // 1: build.bazel.remote.execution.v2.Action.input_root_digest:type_name -> build.bazel.remote.execution.v2.Digest - 65, // 2: build.bazel.remote.execution.v2.Action.timeout:type_name -> google.protobuf.Duration + 67, // 2: build.bazel.remote.execution.v2.Action.timeout:type_name -> google.protobuf.Duration 8, // 3: build.bazel.remote.execution.v2.Action.platform:type_name -> build.bazel.remote.execution.v2.Platform - 58, // 4: build.bazel.remote.execution.v2.Command.environment_variables:type_name -> build.bazel.remote.execution.v2.Command.EnvironmentVariable + 60, // 4: build.bazel.remote.execution.v2.Command.environment_variables:type_name -> build.bazel.remote.execution.v2.Command.EnvironmentVariable 8, // 5: build.bazel.remote.execution.v2.Command.platform:type_name -> build.bazel.remote.execution.v2.Platform 0, // 6: build.bazel.remote.execution.v2.Command.output_directory_format:type_name -> build.bazel.remote.execution.v2.Command.OutputDirectoryFormat - 59, // 7: build.bazel.remote.execution.v2.Platform.properties:type_name -> build.bazel.remote.execution.v2.Platform.Property + 61, // 7: build.bazel.remote.execution.v2.Platform.properties:type_name -> build.bazel.remote.execution.v2.Platform.Property 12, // 8: build.bazel.remote.execution.v2.Directory.files:type_name -> build.bazel.remote.execution.v2.FileNode 13, // 9: build.bazel.remote.execution.v2.Directory.directories:type_name -> build.bazel.remote.execution.v2.DirectoryNode 14, // 10: build.bazel.remote.execution.v2.Directory.symlinks:type_name -> build.bazel.remote.execution.v2.SymlinkNode 11, // 11: build.bazel.remote.execution.v2.Directory.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties 10, // 12: build.bazel.remote.execution.v2.NodeProperties.properties:type_name -> build.bazel.remote.execution.v2.NodeProperty - 66, // 13: build.bazel.remote.execution.v2.NodeProperties.mtime:type_name -> google.protobuf.Timestamp - 67, // 14: build.bazel.remote.execution.v2.NodeProperties.unix_mode:type_name -> google.protobuf.UInt32Value + 68, // 13: build.bazel.remote.execution.v2.NodeProperties.mtime:type_name -> google.protobuf.Timestamp + 69, // 14: build.bazel.remote.execution.v2.NodeProperties.unix_mode:type_name -> google.protobuf.UInt32Value 15, // 15: build.bazel.remote.execution.v2.FileNode.digest:type_name -> build.bazel.remote.execution.v2.Digest 11, // 16: build.bazel.remote.execution.v2.FileNode.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties 15, // 17: build.bazel.remote.execution.v2.DirectoryNode.digest:type_name -> build.bazel.remote.execution.v2.Digest 11, // 18: build.bazel.remote.execution.v2.SymlinkNode.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties - 66, // 19: build.bazel.remote.execution.v2.ExecutedActionMetadata.queued_timestamp:type_name -> google.protobuf.Timestamp - 66, // 20: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_start_timestamp:type_name -> google.protobuf.Timestamp - 66, // 21: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_completed_timestamp:type_name -> google.protobuf.Timestamp - 66, // 22: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_start_timestamp:type_name -> google.protobuf.Timestamp - 66, // 23: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_completed_timestamp:type_name -> google.protobuf.Timestamp - 66, // 24: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_start_timestamp:type_name -> google.protobuf.Timestamp - 66, // 25: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_completed_timestamp:type_name -> google.protobuf.Timestamp - 65, // 26: build.bazel.remote.execution.v2.ExecutedActionMetadata.virtual_execution_duration:type_name -> google.protobuf.Duration - 66, // 27: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_start_timestamp:type_name -> google.protobuf.Timestamp - 66, // 28: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_completed_timestamp:type_name -> google.protobuf.Timestamp - 68, // 29: build.bazel.remote.execution.v2.ExecutedActionMetadata.auxiliary_metadata:type_name -> google.protobuf.Any + 68, // 19: build.bazel.remote.execution.v2.ExecutedActionMetadata.queued_timestamp:type_name -> google.protobuf.Timestamp + 68, // 20: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_start_timestamp:type_name -> google.protobuf.Timestamp + 68, // 21: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_completed_timestamp:type_name -> google.protobuf.Timestamp + 68, // 22: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_start_timestamp:type_name -> google.protobuf.Timestamp + 68, // 23: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_completed_timestamp:type_name -> google.protobuf.Timestamp + 68, // 24: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_start_timestamp:type_name -> google.protobuf.Timestamp + 68, // 25: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_completed_timestamp:type_name -> google.protobuf.Timestamp + 67, // 26: build.bazel.remote.execution.v2.ExecutedActionMetadata.virtual_execution_duration:type_name -> google.protobuf.Duration + 68, // 27: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_start_timestamp:type_name -> google.protobuf.Timestamp + 68, // 28: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_completed_timestamp:type_name -> google.protobuf.Timestamp + 70, // 29: build.bazel.remote.execution.v2.ExecutedActionMetadata.auxiliary_metadata:type_name -> google.protobuf.Any 18, // 30: build.bazel.remote.execution.v2.ActionResult.output_files:type_name -> build.bazel.remote.execution.v2.OutputFile 21, // 31: build.bazel.remote.execution.v2.ActionResult.output_file_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink 21, // 32: build.bazel.remote.execution.v2.ActionResult.output_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink @@ -5857,8 +6048,8 @@ var file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = []int3 2, // 48: build.bazel.remote.execution.v2.ExecuteRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value 15, // 49: build.bazel.remote.execution.v2.LogFile.digest:type_name -> build.bazel.remote.execution.v2.Digest 17, // 50: build.bazel.remote.execution.v2.ExecuteResponse.result:type_name -> build.bazel.remote.execution.v2.ActionResult - 69, // 51: build.bazel.remote.execution.v2.ExecuteResponse.status:type_name -> google.rpc.Status - 60, // 52: build.bazel.remote.execution.v2.ExecuteResponse.server_logs:type_name -> build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry + 71, // 51: build.bazel.remote.execution.v2.ExecuteResponse.status:type_name -> google.rpc.Status + 62, // 52: build.bazel.remote.execution.v2.ExecuteResponse.server_logs:type_name -> build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry 1, // 53: build.bazel.remote.execution.v2.ExecuteOperationMetadata.stage:type_name -> build.bazel.remote.execution.v2.ExecutionStage.Value 15, // 54: build.bazel.remote.execution.v2.ExecuteOperationMetadata.action_digest:type_name -> build.bazel.remote.execution.v2.Digest 16, // 55: build.bazel.remote.execution.v2.ExecuteOperationMetadata.partial_execution_metadata:type_name -> build.bazel.remote.execution.v2.ExecutedActionMetadata @@ -5872,13 +6063,13 @@ var file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = []int3 15, // 63: build.bazel.remote.execution.v2.FindMissingBlobsRequest.blob_digests:type_name -> build.bazel.remote.execution.v2.Digest 2, // 64: build.bazel.remote.execution.v2.FindMissingBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value 15, // 65: build.bazel.remote.execution.v2.FindMissingBlobsResponse.missing_blob_digests:type_name -> build.bazel.remote.execution.v2.Digest - 61, // 66: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.requests:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request + 63, // 66: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.requests:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request 2, // 67: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value - 62, // 68: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response + 64, // 68: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response 15, // 69: build.bazel.remote.execution.v2.BatchReadBlobsRequest.digests:type_name -> build.bazel.remote.execution.v2.Digest 5, // 70: build.bazel.remote.execution.v2.BatchReadBlobsRequest.acceptable_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value 2, // 71: build.bazel.remote.execution.v2.BatchReadBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value - 63, // 72: build.bazel.remote.execution.v2.BatchReadBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response + 65, // 72: build.bazel.remote.execution.v2.BatchReadBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response 15, // 73: build.bazel.remote.execution.v2.GetTreeRequest.root_digest:type_name -> build.bazel.remote.execution.v2.Digest 2, // 74: build.bazel.remote.execution.v2.GetTreeRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value 9, // 75: build.bazel.remote.execution.v2.GetTreeResponse.directories:type_name -> build.bazel.remote.execution.v2.Directory @@ -5887,64 +6078,74 @@ var file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = []int3 3, // 78: build.bazel.remote.execution.v2.SplitBlobRequest.chunking_function:type_name -> build.bazel.remote.execution.v2.ChunkingFunction.Value 15, // 79: build.bazel.remote.execution.v2.SplitBlobResponse.chunk_digests:type_name -> build.bazel.remote.execution.v2.Digest 3, // 80: build.bazel.remote.execution.v2.SplitBlobResponse.chunking_function:type_name -> build.bazel.remote.execution.v2.ChunkingFunction.Value - 15, // 81: build.bazel.remote.execution.v2.SpliceBlobRequest.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest - 15, // 82: build.bazel.remote.execution.v2.SpliceBlobRequest.chunk_digests:type_name -> build.bazel.remote.execution.v2.Digest - 2, // 83: build.bazel.remote.execution.v2.SpliceBlobRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value - 3, // 84: build.bazel.remote.execution.v2.SpliceBlobRequest.chunking_function:type_name -> build.bazel.remote.execution.v2.ChunkingFunction.Value - 15, // 85: build.bazel.remote.execution.v2.SpliceBlobResponse.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest - 52, // 86: build.bazel.remote.execution.v2.ServerCapabilities.cache_capabilities:type_name -> build.bazel.remote.execution.v2.CacheCapabilities - 55, // 87: build.bazel.remote.execution.v2.ServerCapabilities.execution_capabilities:type_name -> build.bazel.remote.execution.v2.ExecutionCapabilities - 70, // 88: build.bazel.remote.execution.v2.ServerCapabilities.deprecated_api_version:type_name -> build.bazel.semver.SemVer - 70, // 89: build.bazel.remote.execution.v2.ServerCapabilities.low_api_version:type_name -> build.bazel.semver.SemVer - 70, // 90: build.bazel.remote.execution.v2.ServerCapabilities.high_api_version:type_name -> build.bazel.semver.SemVer - 64, // 91: build.bazel.remote.execution.v2.PriorityCapabilities.priorities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange - 2, // 92: build.bazel.remote.execution.v2.CacheCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value - 48, // 93: build.bazel.remote.execution.v2.CacheCapabilities.action_cache_update_capabilities:type_name -> build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities - 49, // 94: build.bazel.remote.execution.v2.CacheCapabilities.cache_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities - 4, // 95: build.bazel.remote.execution.v2.CacheCapabilities.symlink_absolute_path_strategy:type_name -> build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value - 5, // 96: build.bazel.remote.execution.v2.CacheCapabilities.supported_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value - 5, // 97: build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_update_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value - 53, // 98: build.bazel.remote.execution.v2.CacheCapabilities.fast_cdc_2020_params:type_name -> build.bazel.remote.execution.v2.FastCdc2020Params - 54, // 99: build.bazel.remote.execution.v2.CacheCapabilities.rep_max_cdc_params:type_name -> build.bazel.remote.execution.v2.RepMaxCdcParams - 2, // 100: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value - 49, // 101: build.bazel.remote.execution.v2.ExecutionCapabilities.execution_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities - 2, // 102: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value - 56, // 103: build.bazel.remote.execution.v2.RequestMetadata.tool_details:type_name -> build.bazel.remote.execution.v2.ToolDetails - 25, // 104: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry.value:type_name -> build.bazel.remote.execution.v2.LogFile - 15, // 105: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.digest:type_name -> build.bazel.remote.execution.v2.Digest - 5, // 106: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value - 15, // 107: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest - 69, // 108: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.status:type_name -> google.rpc.Status - 15, // 109: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest - 5, // 110: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value - 69, // 111: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.status:type_name -> google.rpc.Status - 24, // 112: build.bazel.remote.execution.v2.Execution.Execute:input_type -> build.bazel.remote.execution.v2.ExecuteRequest - 29, // 113: build.bazel.remote.execution.v2.Execution.WaitExecution:input_type -> build.bazel.remote.execution.v2.WaitExecutionRequest - 30, // 114: build.bazel.remote.execution.v2.ActionCache.GetActionResult:input_type -> build.bazel.remote.execution.v2.GetActionResultRequest - 31, // 115: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:input_type -> build.bazel.remote.execution.v2.UpdateActionResultRequest - 32, // 116: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:input_type -> build.bazel.remote.execution.v2.FindMissingBlobsRequest - 34, // 117: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:input_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest - 36, // 118: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:input_type -> build.bazel.remote.execution.v2.BatchReadBlobsRequest - 38, // 119: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:input_type -> build.bazel.remote.execution.v2.GetTreeRequest - 40, // 120: build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob:input_type -> build.bazel.remote.execution.v2.SplitBlobRequest - 42, // 121: build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob:input_type -> build.bazel.remote.execution.v2.SpliceBlobRequest - 44, // 122: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:input_type -> build.bazel.remote.execution.v2.GetCapabilitiesRequest - 71, // 123: build.bazel.remote.execution.v2.Execution.Execute:output_type -> google.longrunning.Operation - 71, // 124: build.bazel.remote.execution.v2.Execution.WaitExecution:output_type -> google.longrunning.Operation - 17, // 125: build.bazel.remote.execution.v2.ActionCache.GetActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult - 17, // 126: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult - 33, // 127: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:output_type -> build.bazel.remote.execution.v2.FindMissingBlobsResponse - 35, // 128: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:output_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse - 37, // 129: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:output_type -> build.bazel.remote.execution.v2.BatchReadBlobsResponse - 39, // 130: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:output_type -> build.bazel.remote.execution.v2.GetTreeResponse - 41, // 131: build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob:output_type -> build.bazel.remote.execution.v2.SplitBlobResponse - 43, // 132: build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob:output_type -> build.bazel.remote.execution.v2.SpliceBlobResponse - 45, // 133: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:output_type -> build.bazel.remote.execution.v2.ServerCapabilities - 123, // [123:134] is the sub-list for method output_type - 112, // [112:123] is the sub-list for method input_type - 112, // [112:112] is the sub-list for extension type_name - 112, // [112:112] is the sub-list for extension extendee - 0, // [0:112] is the sub-list for field type_name + 15, // 81: build.bazel.remote.execution.v2.SplitChunksResponse.chunk_digests:type_name -> build.bazel.remote.execution.v2.Digest + 3, // 82: build.bazel.remote.execution.v2.SplitChunksResponse.chunking_function:type_name -> build.bazel.remote.execution.v2.ChunkingFunction.Value + 15, // 83: build.bazel.remote.execution.v2.SpliceBlobRequest.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest + 15, // 84: build.bazel.remote.execution.v2.SpliceBlobRequest.chunk_digests:type_name -> build.bazel.remote.execution.v2.Digest + 2, // 85: build.bazel.remote.execution.v2.SpliceBlobRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 3, // 86: build.bazel.remote.execution.v2.SpliceBlobRequest.chunking_function:type_name -> build.bazel.remote.execution.v2.ChunkingFunction.Value + 15, // 87: build.bazel.remote.execution.v2.SpliceChunksRequest.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest + 15, // 88: build.bazel.remote.execution.v2.SpliceChunksRequest.chunk_digests:type_name -> build.bazel.remote.execution.v2.Digest + 2, // 89: build.bazel.remote.execution.v2.SpliceChunksRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 3, // 90: build.bazel.remote.execution.v2.SpliceChunksRequest.chunking_function:type_name -> build.bazel.remote.execution.v2.ChunkingFunction.Value + 15, // 91: build.bazel.remote.execution.v2.SpliceBlobResponse.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest + 54, // 92: build.bazel.remote.execution.v2.ServerCapabilities.cache_capabilities:type_name -> build.bazel.remote.execution.v2.CacheCapabilities + 57, // 93: build.bazel.remote.execution.v2.ServerCapabilities.execution_capabilities:type_name -> build.bazel.remote.execution.v2.ExecutionCapabilities + 72, // 94: build.bazel.remote.execution.v2.ServerCapabilities.deprecated_api_version:type_name -> build.bazel.semver.SemVer + 72, // 95: build.bazel.remote.execution.v2.ServerCapabilities.low_api_version:type_name -> build.bazel.semver.SemVer + 72, // 96: build.bazel.remote.execution.v2.ServerCapabilities.high_api_version:type_name -> build.bazel.semver.SemVer + 66, // 97: build.bazel.remote.execution.v2.PriorityCapabilities.priorities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange + 2, // 98: build.bazel.remote.execution.v2.CacheCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 50, // 99: build.bazel.remote.execution.v2.CacheCapabilities.action_cache_update_capabilities:type_name -> build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities + 51, // 100: build.bazel.remote.execution.v2.CacheCapabilities.cache_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities + 4, // 101: build.bazel.remote.execution.v2.CacheCapabilities.symlink_absolute_path_strategy:type_name -> build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value + 5, // 102: build.bazel.remote.execution.v2.CacheCapabilities.supported_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 5, // 103: build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_update_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 55, // 104: build.bazel.remote.execution.v2.CacheCapabilities.fast_cdc_2020_params:type_name -> build.bazel.remote.execution.v2.FastCdc2020Params + 56, // 105: build.bazel.remote.execution.v2.CacheCapabilities.rep_max_cdc_params:type_name -> build.bazel.remote.execution.v2.RepMaxCdcParams + 2, // 106: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 51, // 107: build.bazel.remote.execution.v2.ExecutionCapabilities.execution_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities + 2, // 108: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 58, // 109: build.bazel.remote.execution.v2.RequestMetadata.tool_details:type_name -> build.bazel.remote.execution.v2.ToolDetails + 25, // 110: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry.value:type_name -> build.bazel.remote.execution.v2.LogFile + 15, // 111: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.digest:type_name -> build.bazel.remote.execution.v2.Digest + 5, // 112: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 15, // 113: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest + 71, // 114: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.status:type_name -> google.rpc.Status + 15, // 115: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest + 5, // 116: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 71, // 117: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.status:type_name -> google.rpc.Status + 24, // 118: build.bazel.remote.execution.v2.Execution.Execute:input_type -> build.bazel.remote.execution.v2.ExecuteRequest + 29, // 119: build.bazel.remote.execution.v2.Execution.WaitExecution:input_type -> build.bazel.remote.execution.v2.WaitExecutionRequest + 30, // 120: build.bazel.remote.execution.v2.ActionCache.GetActionResult:input_type -> build.bazel.remote.execution.v2.GetActionResultRequest + 31, // 121: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:input_type -> build.bazel.remote.execution.v2.UpdateActionResultRequest + 32, // 122: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:input_type -> build.bazel.remote.execution.v2.FindMissingBlobsRequest + 34, // 123: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:input_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest + 36, // 124: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:input_type -> build.bazel.remote.execution.v2.BatchReadBlobsRequest + 38, // 125: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:input_type -> build.bazel.remote.execution.v2.GetTreeRequest + 40, // 126: build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob:input_type -> build.bazel.remote.execution.v2.SplitBlobRequest + 40, // 127: build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks:input_type -> build.bazel.remote.execution.v2.SplitBlobRequest + 43, // 128: build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob:input_type -> build.bazel.remote.execution.v2.SpliceBlobRequest + 44, // 129: build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks:input_type -> build.bazel.remote.execution.v2.SpliceChunksRequest + 46, // 130: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:input_type -> build.bazel.remote.execution.v2.GetCapabilitiesRequest + 73, // 131: build.bazel.remote.execution.v2.Execution.Execute:output_type -> google.longrunning.Operation + 73, // 132: build.bazel.remote.execution.v2.Execution.WaitExecution:output_type -> google.longrunning.Operation + 17, // 133: build.bazel.remote.execution.v2.ActionCache.GetActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult + 17, // 134: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult + 33, // 135: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:output_type -> build.bazel.remote.execution.v2.FindMissingBlobsResponse + 35, // 136: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:output_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse + 37, // 137: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:output_type -> build.bazel.remote.execution.v2.BatchReadBlobsResponse + 39, // 138: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:output_type -> build.bazel.remote.execution.v2.GetTreeResponse + 41, // 139: build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob:output_type -> build.bazel.remote.execution.v2.SplitBlobResponse + 42, // 140: build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks:output_type -> build.bazel.remote.execution.v2.SplitChunksResponse + 45, // 141: build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob:output_type -> build.bazel.remote.execution.v2.SpliceBlobResponse + 45, // 142: build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks:output_type -> build.bazel.remote.execution.v2.SpliceBlobResponse + 47, // 143: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:output_type -> build.bazel.remote.execution.v2.ServerCapabilities + 131, // [131:144] is the sub-list for method output_type + 118, // [118:131] is the sub-list for method input_type + 118, // [118:118] is the sub-list for extension type_name + 118, // [118:118] is the sub-list for extension extendee + 0, // [0:118] is the sub-list for field type_name } func init() { file_build_bazel_remote_execution_v2_remote_execution_proto_init() } @@ -5958,7 +6159,7 @@ func file_build_bazel_remote_execution_v2_remote_execution_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc), len(file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc)), NumEnums: 6, - NumMessages: 59, + NumMessages: 61, NumExtensions: 0, NumServices: 4, }, diff --git a/build/bazel/remote/execution/v2/remote_execution.proto b/build/bazel/remote/execution/v2/remote_execution.proto index 8fa38597..dec82bc0 100644 --- a/build/bazel/remote/execution/v2/remote_execution.proto +++ b/build/bazel/remote/execution/v2/remote_execution.proto @@ -471,6 +471,11 @@ service ContentAddressableStorage { // Clients SHOULD verify that the digest of the blob assembled by the fetched // chunks is equal to the requested blob digest. // + // The unary response size is limited by the maximum message size of the + // protocol in use, e.g. gRPC. Clients that expect the list of chunks to + // exceed that limit SHOULD use + // [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks]. + // // The lifetimes of the generated chunk blobs MAY be independent of the // lifetime of the original blob. In particular: // * A blob and any chunk derived from it MAY be evicted from the CAS at @@ -500,6 +505,34 @@ service ContentAddressableStorage { option (google.api.http) = { get: "/v2/{instance_name=**}/blobs/{blob_digest.hash}/{blob_digest.size_bytes}:splitBlob" }; } + // SplitChunks is a streaming variant of SplitBlob. + // + // This RPC is equivalent to + // [ContentAddressableStorage.SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob], + // except that the list of chunk digests is streamed across response messages + // to avoid exceeding protocol message size limits. The complete list of + // chunks is the concatenation of `chunk_digests` across all responses in + // stream order. The server indicates that there are no more chunks by closing + // the response stream. + // + // The maximum message size is not negotiated by this API. Servers SHOULD limit + // the number of chunk digests in each response to remain below the maximum + // message size accepted by the client/server pair. + // + // Starting in RE API v2.13, servers that set + // [CacheCapabilities.split_blob_support][build.bazel.remote.execution.v2.CacheCapabilities.split_blob_support] + // MUST implement this RPC. Clients MUST check that the server supports this + // capability and supports RE API v2.13 or newer before using this RPC. + // + // Errors: + // + // * `NOT_FOUND`: The requested blob is not present in the CAS, OR there is no + // split information available for the blob, OR at least one chunk needed to + // reconstruct the blob is missing from the CAS. + // * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob + // chunks. + rpc SplitChunks(SplitBlobRequest) returns (stream SplitChunksResponse); + // SpliceBlob tells the CAS how chunks can compose a blob. // // This is the complementary operation to the @@ -512,6 +545,11 @@ service ContentAddressableStorage { // compose the original blob. The chunks referenced in the SpliceBlob call SHOULD be // available in the CAS before calling this RPC. // + // The unary request size is limited by the maximum message size of the + // protocol in use, e.g. gRPC. Clients that expect the list of chunks to + // exceed that limit SHOULD use + // [SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks]. + // // If a client needs to upload a large blob and is able to split a blob into // chunks in such a way that reusable chunks are obtained, e.g., by means of // content-defined chunking, it can first determine which parts of the blob @@ -554,10 +592,49 @@ service ContentAddressableStorage { // extend the lifetime of the chunks specified in the request, e.g. because // it prefers a different chunking and extended those instead. Clients can // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // to check what chunk mapping the server is using. rpc SpliceBlob(SpliceBlobRequest) returns (SpliceBlobResponse) { option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:spliceBlob" body: "*" }; } + + // SpliceChunks is a streaming variant of SpliceBlob. + // + // This RPC is equivalent to + // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob], + // except that the list of chunk digests is streamed across request messages + // to avoid exceeding protocol message size limits. Clients MUST set the + // expected blob digest on the first request, stream chunk digests as they + // become available, then close the request stream to commit the splice. The + // server MUST use `instance_name`, `blob_digest`, `digest_function`, and + // `chunking_function` from the first request and ignore values for those + // fields on subsequent requests. Clients SHOULD omit those fields on + // subsequent requests. + // + // The maximum message size is not negotiated by this API. Clients SHOULD limit + // the number of chunk digests in each request to remain below the maximum + // message size accepted by the client/server pair. + // + // Starting in RE API v2.13, servers that set + // [CacheCapabilities.splice_blob_support][build.bazel.remote.execution.v2.CacheCapabilities.splice_blob_support] + // MUST implement this RPC. Clients MUST check that the server supports this + // capability and supports RE API v2.13 or newer before using this RPC. + // + // Errors: + // + // * `NOT_FOUND`: At least one of the blob chunks is not present in the CAS. + // * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the + // spliced blob. + // * `INVALID_ARGUMENT`: The digest of the spliced blob is different from the + // provided expected digest, OR the stream contains an invalid sequence of + // splice requests. + // * `ALREADY_EXISTS`: The blob already exists in CAS and the server did not + // extend the lifetime of the chunks specified in the request, e.g. because + // it prefers a different chunking and extended those instead. Clients can + // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] + // to check what chunk mapping the server is using. + rpc SpliceChunks(stream SpliceChunksRequest) returns (SpliceBlobResponse); } // The Capabilities service may be used by remote execution clients to query @@ -2008,6 +2085,27 @@ message SplitBlobResponse { ChunkingFunction.Value chunking_function = 2; } +// A response message for +// [ContentAddressableStorage.SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks]. +message SplitChunksResponse { + // The ordered list of digests of the chunks into which the blob was split. + // The original blob is assembled by concatenating the chunk data according to + // the order of the digests in this field, across all responses in stream + // order. + // + // Servers SHOULD limit the number of digests in each response to remain below + // the maximum message size accepted by the client/server pair. + // + // The server MUST use the same digest function as the one explicitly or + // implicitly (through hash length) specified in the split request. + repeated Digest chunk_digests = 1; + + // The chunking function used to split the blob. Clients MUST use the value + // from the first response and ignore values sent on subsequent responses. + // Servers SHOULD omit this field on subsequent responses. + ChunkingFunction.Value chunking_function = 2; +} + // A request message for // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob]. message SpliceBlobRequest { @@ -2049,6 +2147,48 @@ message SpliceBlobRequest { ChunkingFunction.Value chunking_function = 5; } +// A request message for +// [ContentAddressableStorage.SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks]. +message SpliceChunksRequest { + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. Servers MUST use the value from the first request and ignore + // values sent on subsequent requests. + string instance_name = 1; + + // Expected digest of the spliced blob. Clients MUST set this on the first + // request. Servers MUST use the value from the first request and ignore values + // sent on subsequent requests. + Digest blob_digest = 2; + + // The ordered list of digests of the chunks which need to be concatenated to + // assemble the original blob. Chunk digests may be split across multiple + // stream requests. The original blob is assembled by concatenating chunks in + // the order of these digests across all requests in stream order. + // + // Clients SHOULD limit the number of digests in each request to remain below + // the maximum message size accepted by the client/server pair. + repeated Digest chunk_digests = 3; + + // The digest function of all chunks to be concatenated and of the blob to be + // spliced. The server MUST use the same digest function for both cases. + // Servers MUST use the value from the first request and ignore values sent on + // subsequent requests. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, SHA384, + // SHA512, or VSO, the client MAY leave this field unset. In that case the + // server SHOULD infer the digest function using the length of the blob digest + // hashes and the digest functions announced in the server's capabilities. + DigestFunction.Value digest_function = 4; + + // The chunking function that the client used to split the blob. Servers MUST + // use the value from the first request and ignore values sent on subsequent + // requests. + ChunkingFunction.Value chunking_function = 5; +} + // A response message for // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob]. message SpliceBlobResponse { @@ -2329,6 +2469,8 @@ message CacheCapabilities { // yes, the server/instance implements the specified behavior for blob // splitting and a meaningful result can be expected from the // [ContentAddressableStorage.SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // operation. Starting in RE API v2.13, this also includes the + // [ContentAddressableStorage.SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // operation. bool split_blob_support = 9; @@ -2336,6 +2478,8 @@ message CacheCapabilities { // yes, the server/instance implements the specified behavior for blob // splicing and a meaningful result can be expected from the // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob] + // operation. Starting in RE API v2.13, this also includes the + // [ContentAddressableStorage.SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks] // operation. bool splice_blob_support = 10; @@ -2346,6 +2490,7 @@ message CacheCapabilities { // The parameters for the RepMaxCDC chunking algorithm. // If set, the server supports the RepMaxCDC chunking algorithm. RepMaxCdcParams rep_max_cdc_params = 12; + } // Parameters for the FastCDC content-defined chunking algorithm. diff --git a/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go b/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go index b23c946b..6214b453 100755 --- a/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go +++ b/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go @@ -609,7 +609,9 @@ const ( ContentAddressableStorage_BatchReadBlobs_FullMethodName = "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs" ContentAddressableStorage_GetTree_FullMethodName = "/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree" ContentAddressableStorage_SplitBlob_FullMethodName = "/build.bazel.remote.execution.v2.ContentAddressableStorage/SplitBlob" + ContentAddressableStorage_SplitChunks_FullMethodName = "/build.bazel.remote.execution.v2.ContentAddressableStorage/SplitChunks" ContentAddressableStorage_SpliceBlob_FullMethodName = "/build.bazel.remote.execution.v2.ContentAddressableStorage/SpliceBlob" + ContentAddressableStorage_SpliceChunks_FullMethodName = "/build.bazel.remote.execution.v2.ContentAddressableStorage/SpliceChunks" ) // ContentAddressableStorageClient is the client API for ContentAddressableStorage service. @@ -880,6 +882,11 @@ type ContentAddressableStorageClient interface { // Clients SHOULD verify that the digest of the blob assembled by the fetched // chunks is equal to the requested blob digest. // + // The unary response size is limited by the maximum message size of the + // protocol in use, e.g. gRPC. Clients that expect the list of chunks to + // exceed that limit SHOULD use + // [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks]. + // // The lifetimes of the generated chunk blobs MAY be independent of the // lifetime of the original blob. In particular: // - A blob and any chunk derived from it MAY be evicted from the CAS at @@ -906,6 +913,33 @@ type ContentAddressableStorageClient interface { // - `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob // chunks. SplitBlob(ctx context.Context, in *SplitBlobRequest, opts ...grpc.CallOption) (*SplitBlobResponse, error) + // SplitChunks is a streaming variant of SplitBlob. + // + // This RPC is equivalent to + // [ContentAddressableStorage.SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob], + // except that the list of chunk digests is streamed across response messages + // to avoid exceeding protocol message size limits. The complete list of + // chunks is the concatenation of `chunk_digests` across all responses in + // stream order. The server indicates that there are no more chunks by closing + // the response stream. + // + // The maximum message size is not negotiated by this API. Servers SHOULD limit + // the number of chunk digests in each response to remain below the maximum + // message size accepted by the client/server pair. + // + // Starting in RE API v2.13, servers that set + // [CacheCapabilities.split_blob_support][build.bazel.remote.execution.v2.CacheCapabilities.split_blob_support] + // MUST implement this RPC. Clients MUST check that the server supports this + // capability and supports RE API v2.13 or newer before using this RPC. + // + // Errors: + // + // - `NOT_FOUND`: The requested blob is not present in the CAS, OR there is no + // split information available for the blob, OR at least one chunk needed to + // reconstruct the blob is missing from the CAS. + // - `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob + // chunks. + SplitChunks(ctx context.Context, in *SplitBlobRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[SplitChunksResponse], error) // SpliceBlob tells the CAS how chunks can compose a blob. // // This is the complementary operation to the @@ -918,6 +952,11 @@ type ContentAddressableStorageClient interface { // compose the original blob. The chunks referenced in the SpliceBlob call SHOULD be // available in the CAS before calling this RPC. // + // The unary request size is limited by the maximum message size of the + // protocol in use, e.g. gRPC. Clients that expect the list of chunks to + // exceed that limit SHOULD use + // [SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks]. + // // If a client needs to upload a large blob and is able to split a blob into // chunks in such a way that reusable chunks are obtained, e.g., by means of // content-defined chunking, it can first determine which parts of the blob @@ -960,8 +999,46 @@ type ContentAddressableStorageClient interface { // extend the lifetime of the chunks specified in the request, e.g. because // it prefers a different chunking and extended those instead. Clients can // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // to check what chunk mapping the server is using. SpliceBlob(ctx context.Context, in *SpliceBlobRequest, opts ...grpc.CallOption) (*SpliceBlobResponse, error) + // SpliceChunks is a streaming variant of SpliceBlob. + // + // This RPC is equivalent to + // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob], + // except that the list of chunk digests is streamed across request messages + // to avoid exceeding protocol message size limits. Clients MUST set the + // expected blob digest on the first request, stream chunk digests as they + // become available, then close the request stream to commit the splice. The + // server MUST use `instance_name`, `blob_digest`, `digest_function`, and + // `chunking_function` from the first request and ignore values for those + // fields on subsequent requests. Clients SHOULD omit those fields on + // subsequent requests. + // + // The maximum message size is not negotiated by this API. Clients SHOULD limit + // the number of chunk digests in each request to remain below the maximum + // message size accepted by the client/server pair. + // + // Starting in RE API v2.13, servers that set + // [CacheCapabilities.splice_blob_support][build.bazel.remote.execution.v2.CacheCapabilities.splice_blob_support] + // MUST implement this RPC. Clients MUST check that the server supports this + // capability and supports RE API v2.13 or newer before using this RPC. + // + // Errors: + // + // - `NOT_FOUND`: At least one of the blob chunks is not present in the CAS. + // - `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the + // spliced blob. + // - `INVALID_ARGUMENT`: The digest of the spliced blob is different from the + // provided expected digest, OR the stream contains an invalid sequence of + // splice requests. + // - `ALREADY_EXISTS`: The blob already exists in CAS and the server did not + // extend the lifetime of the chunks specified in the request, e.g. because + // it prefers a different chunking and extended those instead. Clients can + // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] + // to check what chunk mapping the server is using. + SpliceChunks(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[SpliceChunksRequest, SpliceBlobResponse], error) } type contentAddressableStorageClient struct { @@ -1031,6 +1108,25 @@ func (c *contentAddressableStorageClient) SplitBlob(ctx context.Context, in *Spl return out, nil } +func (c *contentAddressableStorageClient) SplitChunks(ctx context.Context, in *SplitBlobRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[SplitChunksResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ContentAddressableStorage_ServiceDesc.Streams[1], ContentAddressableStorage_SplitChunks_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[SplitBlobRequest, SplitChunksResponse]{ClientStream: stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ContentAddressableStorage_SplitChunksClient = grpc.ServerStreamingClient[SplitChunksResponse] + func (c *contentAddressableStorageClient) SpliceBlob(ctx context.Context, in *SpliceBlobRequest, opts ...grpc.CallOption) (*SpliceBlobResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SpliceBlobResponse) @@ -1041,6 +1137,19 @@ func (c *contentAddressableStorageClient) SpliceBlob(ctx context.Context, in *Sp return out, nil } +func (c *contentAddressableStorageClient) SpliceChunks(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[SpliceChunksRequest, SpliceBlobResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ContentAddressableStorage_ServiceDesc.Streams[2], ContentAddressableStorage_SpliceChunks_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[SpliceChunksRequest, SpliceBlobResponse]{ClientStream: stream} + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ContentAddressableStorage_SpliceChunksClient = grpc.ClientStreamingClient[SpliceChunksRequest, SpliceBlobResponse] + // ContentAddressableStorageServer is the server API for ContentAddressableStorage service. // All implementations should embed UnimplementedContentAddressableStorageServer // for forward compatibility. @@ -1309,6 +1418,11 @@ type ContentAddressableStorageServer interface { // Clients SHOULD verify that the digest of the blob assembled by the fetched // chunks is equal to the requested blob digest. // + // The unary response size is limited by the maximum message size of the + // protocol in use, e.g. gRPC. Clients that expect the list of chunks to + // exceed that limit SHOULD use + // [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks]. + // // The lifetimes of the generated chunk blobs MAY be independent of the // lifetime of the original blob. In particular: // - A blob and any chunk derived from it MAY be evicted from the CAS at @@ -1335,6 +1449,33 @@ type ContentAddressableStorageServer interface { // - `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob // chunks. SplitBlob(context.Context, *SplitBlobRequest) (*SplitBlobResponse, error) + // SplitChunks is a streaming variant of SplitBlob. + // + // This RPC is equivalent to + // [ContentAddressableStorage.SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob], + // except that the list of chunk digests is streamed across response messages + // to avoid exceeding protocol message size limits. The complete list of + // chunks is the concatenation of `chunk_digests` across all responses in + // stream order. The server indicates that there are no more chunks by closing + // the response stream. + // + // The maximum message size is not negotiated by this API. Servers SHOULD limit + // the number of chunk digests in each response to remain below the maximum + // message size accepted by the client/server pair. + // + // Starting in RE API v2.13, servers that set + // [CacheCapabilities.split_blob_support][build.bazel.remote.execution.v2.CacheCapabilities.split_blob_support] + // MUST implement this RPC. Clients MUST check that the server supports this + // capability and supports RE API v2.13 or newer before using this RPC. + // + // Errors: + // + // - `NOT_FOUND`: The requested blob is not present in the CAS, OR there is no + // split information available for the blob, OR at least one chunk needed to + // reconstruct the blob is missing from the CAS. + // - `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob + // chunks. + SplitChunks(*SplitBlobRequest, grpc.ServerStreamingServer[SplitChunksResponse]) error // SpliceBlob tells the CAS how chunks can compose a blob. // // This is the complementary operation to the @@ -1347,6 +1488,11 @@ type ContentAddressableStorageServer interface { // compose the original blob. The chunks referenced in the SpliceBlob call SHOULD be // available in the CAS before calling this RPC. // + // The unary request size is limited by the maximum message size of the + // protocol in use, e.g. gRPC. Clients that expect the list of chunks to + // exceed that limit SHOULD use + // [SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks]. + // // If a client needs to upload a large blob and is able to split a blob into // chunks in such a way that reusable chunks are obtained, e.g., by means of // content-defined chunking, it can first determine which parts of the blob @@ -1389,8 +1535,46 @@ type ContentAddressableStorageServer interface { // extend the lifetime of the chunks specified in the request, e.g. because // it prefers a different chunking and extended those instead. Clients can // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // to check what chunk mapping the server is using. SpliceBlob(context.Context, *SpliceBlobRequest) (*SpliceBlobResponse, error) + // SpliceChunks is a streaming variant of SpliceBlob. + // + // This RPC is equivalent to + // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob], + // except that the list of chunk digests is streamed across request messages + // to avoid exceeding protocol message size limits. Clients MUST set the + // expected blob digest on the first request, stream chunk digests as they + // become available, then close the request stream to commit the splice. The + // server MUST use `instance_name`, `blob_digest`, `digest_function`, and + // `chunking_function` from the first request and ignore values for those + // fields on subsequent requests. Clients SHOULD omit those fields on + // subsequent requests. + // + // The maximum message size is not negotiated by this API. Clients SHOULD limit + // the number of chunk digests in each request to remain below the maximum + // message size accepted by the client/server pair. + // + // Starting in RE API v2.13, servers that set + // [CacheCapabilities.splice_blob_support][build.bazel.remote.execution.v2.CacheCapabilities.splice_blob_support] + // MUST implement this RPC. Clients MUST check that the server supports this + // capability and supports RE API v2.13 or newer before using this RPC. + // + // Errors: + // + // - `NOT_FOUND`: At least one of the blob chunks is not present in the CAS. + // - `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the + // spliced blob. + // - `INVALID_ARGUMENT`: The digest of the spliced blob is different from the + // provided expected digest, OR the stream contains an invalid sequence of + // splice requests. + // - `ALREADY_EXISTS`: The blob already exists in CAS and the server did not + // extend the lifetime of the chunks specified in the request, e.g. because + // it prefers a different chunking and extended those instead. Clients can + // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] + // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] + // to check what chunk mapping the server is using. + SpliceChunks(grpc.ClientStreamingServer[SpliceChunksRequest, SpliceBlobResponse]) error } // UnimplementedContentAddressableStorageServer should be embedded to have @@ -1415,9 +1599,15 @@ func (UnimplementedContentAddressableStorageServer) GetTree(*GetTreeRequest, grp func (UnimplementedContentAddressableStorageServer) SplitBlob(context.Context, *SplitBlobRequest) (*SplitBlobResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SplitBlob not implemented") } +func (UnimplementedContentAddressableStorageServer) SplitChunks(*SplitBlobRequest, grpc.ServerStreamingServer[SplitChunksResponse]) error { + return status.Errorf(codes.Unimplemented, "method SplitChunks not implemented") +} func (UnimplementedContentAddressableStorageServer) SpliceBlob(context.Context, *SpliceBlobRequest) (*SpliceBlobResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SpliceBlob not implemented") } +func (UnimplementedContentAddressableStorageServer) SpliceChunks(grpc.ClientStreamingServer[SpliceChunksRequest, SpliceBlobResponse]) error { + return status.Errorf(codes.Unimplemented, "method SpliceChunks not implemented") +} func (UnimplementedContentAddressableStorageServer) testEmbeddedByValue() {} // UnsafeContentAddressableStorageServer may be embedded to opt out of forward compatibility for this service. @@ -1521,6 +1711,17 @@ func _ContentAddressableStorage_SplitBlob_Handler(srv interface{}, ctx context.C return interceptor(ctx, in, info, handler) } +func _ContentAddressableStorage_SplitChunks_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SplitBlobRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ContentAddressableStorageServer).SplitChunks(m, &grpc.GenericServerStream[SplitBlobRequest, SplitChunksResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ContentAddressableStorage_SplitChunksServer = grpc.ServerStreamingServer[SplitChunksResponse] + func _ContentAddressableStorage_SpliceBlob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SpliceBlobRequest) if err := dec(in); err != nil { @@ -1539,6 +1740,13 @@ func _ContentAddressableStorage_SpliceBlob_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ContentAddressableStorage_SpliceChunks_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ContentAddressableStorageServer).SpliceChunks(&grpc.GenericServerStream[SpliceChunksRequest, SpliceBlobResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ContentAddressableStorage_SpliceChunksServer = grpc.ClientStreamingServer[SpliceChunksRequest, SpliceBlobResponse] + // ContentAddressableStorage_ServiceDesc is the grpc.ServiceDesc for ContentAddressableStorage service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1573,6 +1781,16 @@ var ContentAddressableStorage_ServiceDesc = grpc.ServiceDesc{ Handler: _ContentAddressableStorage_GetTree_Handler, ServerStreams: true, }, + { + StreamName: "SplitChunks", + Handler: _ContentAddressableStorage_SplitChunks_Handler, + ServerStreams: true, + }, + { + StreamName: "SpliceChunks", + Handler: _ContentAddressableStorage_SpliceChunks_Handler, + ClientStreams: true, + }, }, Metadata: "build/bazel/remote/execution/v2/remote_execution.proto", } From 1148d969a5dce64b15bbf4dde5e963c37a3ca52e Mon Sep 17 00:00:00 2001 From: Tyler French Date: Mon, 15 Jun 2026 15:06:55 -0400 Subject: [PATCH 2/2] comments --- .../remote/execution/v2/remote_execution.pb.go | 8 ++++---- .../remote/execution/v2/remote_execution.proto | 13 ++++++++----- .../remote/execution/v2/remote_execution_grpc.pb.go | 8 ++++++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/build/bazel/remote/execution/v2/remote_execution.pb.go b/build/bazel/remote/execution/v2/remote_execution.pb.go index 5d153021..b8574842 100755 --- a/build/bazel/remote/execution/v2/remote_execution.pb.go +++ b/build/bazel/remote/execution/v2/remote_execution.pb.go @@ -4575,17 +4575,17 @@ type CacheCapabilities struct { // yes, the server/instance implements the specified behavior for blob // splitting and a meaningful result can be expected from the // [ContentAddressableStorage.SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] - // operation. Starting in RE API v2.13, this also includes the + // operation for RE API v2.12 and from the // [ContentAddressableStorage.SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] - // operation. + // operation for RE API v2.13 or higher. SplitBlobSupport bool `protobuf:"varint,9,opt,name=split_blob_support,json=splitBlobSupport,proto3" json:"split_blob_support,omitempty"` // Whether blob splicing is supported for the particular server/instance. If // yes, the server/instance implements the specified behavior for blob // splicing and a meaningful result can be expected from the // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob] - // operation. Starting in RE API v2.13, this also includes the + // operation for RE API v2.12 and from the // [ContentAddressableStorage.SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks] - // operation. + // operation for RE API v2.13 or higher. SpliceBlobSupport bool `protobuf:"varint,10,opt,name=splice_blob_support,json=spliceBlobSupport,proto3" json:"splice_blob_support,omitempty"` // The parameters for the FastCDC 2020 chunking algorithm. // If set, the server supports the FastCDC chunking algorithm. diff --git a/build/bazel/remote/execution/v2/remote_execution.proto b/build/bazel/remote/execution/v2/remote_execution.proto index dec82bc0..7cb3e347 100644 --- a/build/bazel/remote/execution/v2/remote_execution.proto +++ b/build/bazel/remote/execution/v2/remote_execution.proto @@ -594,6 +594,10 @@ service ContentAddressableStorage { // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // to check what chunk mapping the server is using. + // + // New in v2.12 and removed in v2.13, use + // [SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks] + // instead. rpc SpliceBlob(SpliceBlobRequest) returns (SpliceBlobResponse) { option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:spliceBlob" body: "*" }; } @@ -2469,18 +2473,18 @@ message CacheCapabilities { // yes, the server/instance implements the specified behavior for blob // splitting and a meaningful result can be expected from the // [ContentAddressableStorage.SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] - // operation. Starting in RE API v2.13, this also includes the + // operation for RE API v2.12 and from the // [ContentAddressableStorage.SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] - // operation. + // operation for RE API v2.13 or higher. bool split_blob_support = 9; // Whether blob splicing is supported for the particular server/instance. If // yes, the server/instance implements the specified behavior for blob // splicing and a meaningful result can be expected from the // [ContentAddressableStorage.SpliceBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceBlob] - // operation. Starting in RE API v2.13, this also includes the + // operation for RE API v2.12 and from the // [ContentAddressableStorage.SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks] - // operation. + // operation for RE API v2.13 or higher. bool splice_blob_support = 10; // The parameters for the FastCDC 2020 chunking algorithm. @@ -2490,7 +2494,6 @@ message CacheCapabilities { // The parameters for the RepMaxCDC chunking algorithm. // If set, the server supports the RepMaxCDC chunking algorithm. RepMaxCdcParams rep_max_cdc_params = 12; - } // Parameters for the FastCDC content-defined chunking algorithm. diff --git a/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go b/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go index 6214b453..1fbe376c 100755 --- a/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go +++ b/build/bazel/remote/execution/v2/remote_execution_grpc.pb.go @@ -1001,6 +1001,10 @@ type ContentAddressableStorageClient interface { // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // to check what chunk mapping the server is using. + // + // New in v2.12 and removed in v2.13, use + // [SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks] + // instead. SpliceBlob(ctx context.Context, in *SpliceBlobRequest, opts ...grpc.CallOption) (*SpliceBlobResponse, error) // SpliceChunks is a streaming variant of SpliceBlob. // @@ -1537,6 +1541,10 @@ type ContentAddressableStorageServer interface { // call [SplitBlob][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitBlob] // or [SplitChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SplitChunks] // to check what chunk mapping the server is using. + // + // New in v2.12 and removed in v2.13, use + // [SpliceChunks][build.bazel.remote.execution.v2.ContentAddressableStorage.SpliceChunks] + // instead. SpliceBlob(context.Context, *SpliceBlobRequest) (*SpliceBlobResponse, error) // SpliceChunks is a streaming variant of SpliceBlob. //