diff --git a/client/daemon/peer/peertask_conductor.go b/client/daemon/peer/peertask_conductor.go index ffb06efe4..47d8d5f0e 100644 --- a/client/daemon/peer/peertask_conductor.go +++ b/client/daemon/peer/peertask_conductor.go @@ -792,6 +792,8 @@ func (pt *peerTaskConductor) confirmReceivePeerPacketError(err error) (cont bool failedCode = commonv1.Code_UnknownError failedReason string ) + // extract DfError for grpc status + err = dferrors.ConvertGRPCErrorToDfError(err) de, ok := err.(*dferrors.DfError) if ok { switch de.Code { diff --git a/internal/dferrors/error.go b/internal/dferrors/error.go index 6a1c27d61..546ecdbea 100644 --- a/internal/dferrors/error.go +++ b/internal/dferrors/error.go @@ -20,6 +20,8 @@ import ( "errors" "fmt" + "google.golang.org/grpc/status" + commonv1 "d7y.io/api/pkg/apis/common/v1" ) @@ -70,3 +72,33 @@ func CheckError(err error, code commonv1.Code) bool { return ok && e.Code == code } + +// ConvertGRPCErrorToDfError converts grpc error to DfError, if it exists. +func ConvertGRPCErrorToDfError(err error) error { + for _, d := range status.Convert(err).Details() { + switch internal := d.(type) { + case *commonv1.GrpcDfError: + return &DfError{ + Code: internal.Code, + Message: internal.Message, + } + } + } + + return err +} + +// ConvertDfErrorToGRPCError converts DfError to grpc error, if it is. +func ConvertDfErrorToGRPCError(err error) error { + if v, ok := err.(*DfError); ok { + s, e := status.Convert(err).WithDetails( + &commonv1.GrpcDfError{ + Code: v.Code, + Message: v.Message, + }) + if e == nil { + err = s.Err() + } + } + return err +} diff --git a/pkg/rpc/interceptor.go b/pkg/rpc/interceptor.go index a10f3bc64..b72aa18f2 100644 --- a/pkg/rpc/interceptor.go +++ b/pkg/rpc/interceptor.go @@ -24,10 +24,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - commonv1 "d7y.io/api/pkg/apis/common/v1" - "d7y.io/dragonfly/v2/internal/dferrors" - logger "d7y.io/dragonfly/v2/internal/dflog" ) // Refresher is the interface for refreshing dynconfig. @@ -90,7 +87,7 @@ func (r *RateLimiterInterceptor) Limit() bool { func ConvertErrorUnaryServerInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { h, err := handler(ctx, req) if err != nil { - return h, convertServerError(err) + return h, dferrors.ConvertDfErrorToGRPCError(err) } return h, nil @@ -99,34 +96,16 @@ func ConvertErrorUnaryServerInterceptor(ctx context.Context, req any, info *grpc // ConvertErrorStreamServerInterceptor returns a new stream server interceptor that convert error when trigger custom error. func ConvertErrorStreamServerInterceptor(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { if err := handler(srv, ss); err != nil { - return convertServerError(err) + return dferrors.ConvertDfErrorToGRPCError(err) } return nil } -// convertServerError converts custom error of server. -func convertServerError(err error) error { - if status.Code(err) == codes.InvalidArgument { - err = dferrors.New(commonv1.Code_BadRequest, err.Error()) - } - - if v, ok := err.(*dferrors.DfError); ok { - logger.GrpcLogger.Errorf(v.Message) - if s, e := status.Convert(err).WithDetails(&commonv1.GrpcDfError{ - Code: v.Code, - Message: v.Message, - }); e == nil { - err = s.Err() - } - } - return err -} - // ConvertErrorUnaryClientInterceptor returns a new unary client interceptor that convert error when trigger custom error. func ConvertErrorUnaryClientInterceptor(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { if err := invoker(ctx, method, req, reply, cc, opts...); err != nil { - return convertClientError(err) + return dferrors.ConvertGRPCErrorToDfError(err) } return nil @@ -136,23 +115,8 @@ func ConvertErrorUnaryClientInterceptor(ctx context.Context, method string, req, func ConvertErrorStreamClientInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { s, err := streamer(ctx, desc, cc, method, opts...) if err != nil { - return nil, convertClientError(err) + return nil, dferrors.ConvertGRPCErrorToDfError(err) } return s, nil } - -// convertClientError converts custom error of client. -func convertClientError(err error) error { - for _, d := range status.Convert(err).Details() { - switch internal := d.(type) { - case *commonv1.GrpcDfError: - return &dferrors.DfError{ - Code: internal.Code, - Message: internal.Message, - } - } - } - - return err -}