feat: add PING mechanism for connection health checks; update proto and generated files

- Introduced PING code in TaskServiceConnectCode enum for health checks.
- Updated Runner to use proper PING messages instead of fake log messages for connection health checks.
- Modified TaskServiceServer to handle PING requests and acknowledge them.
- Adjusted generated gRPC files to reflect changes in proto definitions and ensure compatibility.
This commit is contained in:
Marvin Zhang
2025-08-16 17:19:21 +08:00
parent babecc46c0
commit 65aeb3ed8c
5 changed files with 275 additions and 120 deletions

View File

@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.5.1
// - protoc v5.29.2
// - protoc-gen-go-grpc v1.4.0
// - protoc v5.27.2
// source: services/task_service.proto
package grpc
@@ -15,8 +15,8 @@ import (
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.64.0 or later.
const _ = grpc.SupportPackageIsVersion9
// Requires gRPC-Go v1.62.0 or later.
const _ = grpc.SupportPackageIsVersion8
const (
TaskService_Subscribe_FullMethodName = "/grpc.TaskService/Subscribe"
@@ -29,8 +29,8 @@ const (
//
// 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 TaskServiceClient interface {
Subscribe(ctx context.Context, in *TaskServiceSubscribeRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[TaskServiceSubscribeResponse], error)
Connect(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[TaskServiceConnectRequest, Response], error)
Subscribe(ctx context.Context, in *TaskServiceSubscribeRequest, opts ...grpc.CallOption) (TaskService_SubscribeClient, error)
Connect(ctx context.Context, opts ...grpc.CallOption) (TaskService_ConnectClient, error)
FetchTask(ctx context.Context, in *TaskServiceFetchTaskRequest, opts ...grpc.CallOption) (*TaskServiceFetchTaskResponse, error)
SendNotification(ctx context.Context, in *TaskServiceSendNotificationRequest, opts ...grpc.CallOption) (*Response, error)
}
@@ -43,13 +43,13 @@ func NewTaskServiceClient(cc grpc.ClientConnInterface) TaskServiceClient {
return &taskServiceClient{cc}
}
func (c *taskServiceClient) Subscribe(ctx context.Context, in *TaskServiceSubscribeRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[TaskServiceSubscribeResponse], error) {
func (c *taskServiceClient) Subscribe(ctx context.Context, in *TaskServiceSubscribeRequest, opts ...grpc.CallOption) (TaskService_SubscribeClient, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
stream, err := c.cc.NewStream(ctx, &TaskService_ServiceDesc.Streams[0], TaskService_Subscribe_FullMethodName, cOpts...)
if err != nil {
return nil, err
}
x := &grpc.GenericClientStream[TaskServiceSubscribeRequest, TaskServiceSubscribeResponse]{ClientStream: stream}
x := &taskServiceSubscribeClient{ClientStream: stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
@@ -59,21 +59,57 @@ func (c *taskServiceClient) Subscribe(ctx context.Context, in *TaskServiceSubscr
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 TaskService_SubscribeClient = grpc.ServerStreamingClient[TaskServiceSubscribeResponse]
type TaskService_SubscribeClient interface {
Recv() (*TaskServiceSubscribeResponse, error)
grpc.ClientStream
}
func (c *taskServiceClient) Connect(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[TaskServiceConnectRequest, Response], error) {
type taskServiceSubscribeClient struct {
grpc.ClientStream
}
func (x *taskServiceSubscribeClient) Recv() (*TaskServiceSubscribeResponse, error) {
m := new(TaskServiceSubscribeResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func (c *taskServiceClient) Connect(ctx context.Context, opts ...grpc.CallOption) (TaskService_ConnectClient, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
stream, err := c.cc.NewStream(ctx, &TaskService_ServiceDesc.Streams[1], TaskService_Connect_FullMethodName, cOpts...)
if err != nil {
return nil, err
}
x := &grpc.GenericClientStream[TaskServiceConnectRequest, Response]{ClientStream: stream}
x := &taskServiceConnectClient{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 TaskService_ConnectClient = grpc.ClientStreamingClient[TaskServiceConnectRequest, Response]
type TaskService_ConnectClient interface {
Send(*TaskServiceConnectRequest) error
CloseAndRecv() (*Response, error)
grpc.ClientStream
}
type taskServiceConnectClient struct {
grpc.ClientStream
}
func (x *taskServiceConnectClient) Send(m *TaskServiceConnectRequest) error {
return x.ClientStream.SendMsg(m)
}
func (x *taskServiceConnectClient) CloseAndRecv() (*Response, error) {
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
m := new(Response)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func (c *taskServiceClient) FetchTask(ctx context.Context, in *TaskServiceFetchTaskRequest, opts ...grpc.CallOption) (*TaskServiceFetchTaskResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
@@ -97,26 +133,23 @@ func (c *taskServiceClient) SendNotification(ctx context.Context, in *TaskServic
// TaskServiceServer is the server API for TaskService service.
// All implementations must embed UnimplementedTaskServiceServer
// for forward compatibility.
// for forward compatibility
type TaskServiceServer interface {
Subscribe(*TaskServiceSubscribeRequest, grpc.ServerStreamingServer[TaskServiceSubscribeResponse]) error
Connect(grpc.ClientStreamingServer[TaskServiceConnectRequest, Response]) error
Subscribe(*TaskServiceSubscribeRequest, TaskService_SubscribeServer) error
Connect(TaskService_ConnectServer) error
FetchTask(context.Context, *TaskServiceFetchTaskRequest) (*TaskServiceFetchTaskResponse, error)
SendNotification(context.Context, *TaskServiceSendNotificationRequest) (*Response, error)
mustEmbedUnimplementedTaskServiceServer()
}
// UnimplementedTaskServiceServer must be embedded to have
// forward compatible implementations.
//
// NOTE: this should be embedded by value instead of pointer to avoid a nil
// pointer dereference when methods are called.
type UnimplementedTaskServiceServer struct{}
// UnimplementedTaskServiceServer must be embedded to have forward compatible implementations.
type UnimplementedTaskServiceServer struct {
}
func (UnimplementedTaskServiceServer) Subscribe(*TaskServiceSubscribeRequest, grpc.ServerStreamingServer[TaskServiceSubscribeResponse]) error {
func (UnimplementedTaskServiceServer) Subscribe(*TaskServiceSubscribeRequest, TaskService_SubscribeServer) error {
return status.Errorf(codes.Unimplemented, "method Subscribe not implemented")
}
func (UnimplementedTaskServiceServer) Connect(grpc.ClientStreamingServer[TaskServiceConnectRequest, Response]) error {
func (UnimplementedTaskServiceServer) Connect(TaskService_ConnectServer) error {
return status.Errorf(codes.Unimplemented, "method Connect not implemented")
}
func (UnimplementedTaskServiceServer) FetchTask(context.Context, *TaskServiceFetchTaskRequest) (*TaskServiceFetchTaskResponse, error) {
@@ -126,7 +159,6 @@ func (UnimplementedTaskServiceServer) SendNotification(context.Context, *TaskSer
return nil, status.Errorf(codes.Unimplemented, "method SendNotification not implemented")
}
func (UnimplementedTaskServiceServer) mustEmbedUnimplementedTaskServiceServer() {}
func (UnimplementedTaskServiceServer) testEmbeddedByValue() {}
// UnsafeTaskServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to TaskServiceServer will
@@ -136,13 +168,6 @@ type UnsafeTaskServiceServer interface {
}
func RegisterTaskServiceServer(s grpc.ServiceRegistrar, srv TaskServiceServer) {
// If the following call pancis, it indicates UnimplementedTaskServiceServer was
// embedded by pointer and is nil. This will cause panics if an
// unimplemented method is ever invoked, so we test this at initialization
// time to prevent it from happening at runtime later due to I/O.
if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
t.testEmbeddedByValue()
}
s.RegisterService(&TaskService_ServiceDesc, srv)
}
@@ -151,18 +176,47 @@ func _TaskService_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) e
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(TaskServiceServer).Subscribe(m, &grpc.GenericServerStream[TaskServiceSubscribeRequest, TaskServiceSubscribeResponse]{ServerStream: stream})
return srv.(TaskServiceServer).Subscribe(m, &taskServiceSubscribeServer{ServerStream: stream})
}
// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
type TaskService_SubscribeServer = grpc.ServerStreamingServer[TaskServiceSubscribeResponse]
type TaskService_SubscribeServer interface {
Send(*TaskServiceSubscribeResponse) error
grpc.ServerStream
}
type taskServiceSubscribeServer struct {
grpc.ServerStream
}
func (x *taskServiceSubscribeServer) Send(m *TaskServiceSubscribeResponse) error {
return x.ServerStream.SendMsg(m)
}
func _TaskService_Connect_Handler(srv interface{}, stream grpc.ServerStream) error {
return srv.(TaskServiceServer).Connect(&grpc.GenericServerStream[TaskServiceConnectRequest, Response]{ServerStream: stream})
return srv.(TaskServiceServer).Connect(&taskServiceConnectServer{ServerStream: stream})
}
// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
type TaskService_ConnectServer = grpc.ClientStreamingServer[TaskServiceConnectRequest, Response]
type TaskService_ConnectServer interface {
SendAndClose(*Response) error
Recv() (*TaskServiceConnectRequest, error)
grpc.ServerStream
}
type taskServiceConnectServer struct {
grpc.ServerStream
}
func (x *taskServiceConnectServer) SendAndClose(m *Response) error {
return x.ServerStream.SendMsg(m)
}
func (x *taskServiceConnectServer) Recv() (*TaskServiceConnectRequest, error) {
m := new(TaskServiceConnectRequest)
if err := x.ServerStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func _TaskService_FetchTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TaskServiceFetchTaskRequest)