about summary refs log tree commit diff
path: root/tvix/store/protos/rpc_pathinfo_grpc.pb.go
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2022-12-28T13·06+0100
committerflokli <flokli@flokli.de>2022-12-28T13·55+0000
commitd973c9772d63ea106cf378267298d87bd37beee1 (patch)
tree86d5d5120c35be6ba1e8c17cc2b8d741cb0b2427 /tvix/store/protos/rpc_pathinfo_grpc.pb.go
parentce7be009946221425b1176b79fe44f559dd66c53 (diff)
chore(tvix/store/protos): add PathInfoService::CalculateNAR() r/5525
Expose the NAR calculation to a separate `CalculateNAR` method, which
responds with the NAR size and sha256 hash.

Contrary to what cl/7618 and cl/7620 initially did, don't add different
other request types.

In the CalculateNARResponse message, there's now some duplication in the
(optional) `narinfo` field of a PathInfo, but I'm not entirely sure if
we want to drop the fields from there yet.

Change-Id: Id797c56e17efedac115fbd43de9dfde9fa1db140
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7663
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Diffstat (limited to '')
-rw-r--r--tvix/store/protos/rpc_pathinfo_grpc.pb.go88
1 files changed, 78 insertions, 10 deletions
diff --git a/tvix/store/protos/rpc_pathinfo_grpc.pb.go b/tvix/store/protos/rpc_pathinfo_grpc.pb.go
index b94d24dc5b..a69820e358 100644
--- a/tvix/store/protos/rpc_pathinfo_grpc.pb.go
+++ b/tvix/store/protos/rpc_pathinfo_grpc.pb.go
@@ -22,22 +22,39 @@ const _ = grpc.SupportPackageIsVersion7
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type PathInfoServiceClient interface {
-	// Get retrieves a PathInfo object, by using the lookup parameters in
-	// GetPathInfoRequest.
-	// If the PathInfo object contains a DirectoryNode, it needs to be looked
-	// up separately via the DirectoryService, which is purely
-	// content-addressed.
+	// Return a PathInfo message, identified by the decoded nixbase32 part
+	// of a Nix output path.
+	//
+	// To substitute /nix/store/xm35nga2g20mz5sm5l6n8v3bdm86yj83-
+	// cowsay-3.04 the bytes in the request would be
+	// nixbase32dec("xm35nga2g20mz5sm5l6n8v3bdm86yj83").
 	Get(ctx context.Context, in *GetPathInfoRequest, opts ...grpc.CallOption) (*PathInfo, error)
 	// Put uploads a PathInfo object to the remote end. It MUST not return
 	// until the PathInfo object has been written on the the remote end.
+	//
 	// The remote end MAY check if a potential DirectoryNode has already been
 	// uploaded.
+	//
 	// Uploading clients SHOULD obviously not steer other machines to try to
 	// substitute before from the remote end before having finished uploading
 	// PathInfo, Directories and Blobs.
 	// The returned PathInfo object MAY contain additional narinfo signatures,
 	// but is otherwise left untouched.
 	Put(ctx context.Context, in *PathInfo, opts ...grpc.CallOption) (*PathInfo, error)
+	// Calculate the NAR representation of the contents specified by the
+	// root_node. The calculation SHOULD be cached server-side for subsequent
+	// requests.
+	//
+	// All references (to blobs or Directory messages) MUST already exist in
+	// the store.
+	//
+	// The method can be used to produce a Nix fixed-output path, which
+	// contains the (compressed) sha256 of the NAR content representation in
+	// the root_node name (suffixed with the name).
+	//
+	// It can also be used to calculate arbitrary NAR hashes of output paths,
+	// in case a legacy Nix Binary Cache frontend is provided.
+	CalculateNAR(ctx context.Context, in *Node, opts ...grpc.CallOption) (*CalculateNARResponse, error)
 }
 
 type pathInfoServiceClient struct {
@@ -66,26 +83,52 @@ func (c *pathInfoServiceClient) Put(ctx context.Context, in *PathInfo, opts ...g
 	return out, nil
 }
 
+func (c *pathInfoServiceClient) CalculateNAR(ctx context.Context, in *Node, opts ...grpc.CallOption) (*CalculateNARResponse, error) {
+	out := new(CalculateNARResponse)
+	err := c.cc.Invoke(ctx, "/tvix.store.v1.PathInfoService/CalculateNAR", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // PathInfoServiceServer is the server API for PathInfoService service.
 // All implementations must embed UnimplementedPathInfoServiceServer
 // for forward compatibility
 type PathInfoServiceServer interface {
-	// Get retrieves a PathInfo object, by using the lookup parameters in
-	// GetPathInfoRequest.
-	// If the PathInfo object contains a DirectoryNode, it needs to be looked
-	// up separately via the DirectoryService, which is purely
-	// content-addressed.
+	// Return a PathInfo message, identified by the decoded nixbase32 part
+	// of a Nix output path.
+	//
+	// To substitute /nix/store/xm35nga2g20mz5sm5l6n8v3bdm86yj83-
+	// cowsay-3.04 the bytes in the request would be
+	// nixbase32dec("xm35nga2g20mz5sm5l6n8v3bdm86yj83").
 	Get(context.Context, *GetPathInfoRequest) (*PathInfo, error)
 	// Put uploads a PathInfo object to the remote end. It MUST not return
 	// until the PathInfo object has been written on the the remote end.
+	//
 	// The remote end MAY check if a potential DirectoryNode has already been
 	// uploaded.
+	//
 	// Uploading clients SHOULD obviously not steer other machines to try to
 	// substitute before from the remote end before having finished uploading
 	// PathInfo, Directories and Blobs.
 	// The returned PathInfo object MAY contain additional narinfo signatures,
 	// but is otherwise left untouched.
 	Put(context.Context, *PathInfo) (*PathInfo, error)
+	// Calculate the NAR representation of the contents specified by the
+	// root_node. The calculation SHOULD be cached server-side for subsequent
+	// requests.
+	//
+	// All references (to blobs or Directory messages) MUST already exist in
+	// the store.
+	//
+	// The method can be used to produce a Nix fixed-output path, which
+	// contains the (compressed) sha256 of the NAR content representation in
+	// the root_node name (suffixed with the name).
+	//
+	// It can also be used to calculate arbitrary NAR hashes of output paths,
+	// in case a legacy Nix Binary Cache frontend is provided.
+	CalculateNAR(context.Context, *Node) (*CalculateNARResponse, error)
 	mustEmbedUnimplementedPathInfoServiceServer()
 }
 
@@ -99,6 +142,9 @@ func (UnimplementedPathInfoServiceServer) Get(context.Context, *GetPathInfoReque
 func (UnimplementedPathInfoServiceServer) Put(context.Context, *PathInfo) (*PathInfo, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Put not implemented")
 }
+func (UnimplementedPathInfoServiceServer) CalculateNAR(context.Context, *Node) (*CalculateNARResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CalculateNAR not implemented")
+}
 func (UnimplementedPathInfoServiceServer) mustEmbedUnimplementedPathInfoServiceServer() {}
 
 // UnsafePathInfoServiceServer may be embedded to opt out of forward compatibility for this service.
@@ -148,6 +194,24 @@ func _PathInfoService_Put_Handler(srv interface{}, ctx context.Context, dec func
 	return interceptor(ctx, in, info, handler)
 }
 
+func _PathInfoService_CalculateNAR_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Node)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PathInfoServiceServer).CalculateNAR(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/tvix.store.v1.PathInfoService/CalculateNAR",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PathInfoServiceServer).CalculateNAR(ctx, req.(*Node))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // PathInfoService_ServiceDesc is the grpc.ServiceDesc for PathInfoService service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -163,6 +227,10 @@ var PathInfoService_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "Put",
 			Handler:    _PathInfoService_Put_Handler,
 		},
+		{
+			MethodName: "CalculateNAR",
+			Handler:    _PathInfoService_CalculateNAR_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "tvix/store/protos/rpc_pathinfo.proto",