From 851fee9c23bb510f38339032dd7b0b3726fd6c2c Mon Sep 17 00:00:00 2001 From: Vladyslav Simonenko Date: Tue, 7 Jul 2026 12:30:32 -0700 Subject: [PATCH 1/2] Add WorkflowTaskBufferLost serviceerror --- serviceerror/convert.go | 2 + serviceerror/convert_test.go | 16 +++++++ serviceerror/workflow_task_buffer_lost.go | 56 +++++++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 serviceerror/workflow_task_buffer_lost.go diff --git a/serviceerror/convert.go b/serviceerror/convert.go index 603a176b..dc2d5596 100644 --- a/serviceerror/convert.go +++ b/serviceerror/convert.go @@ -93,6 +93,8 @@ func FromStatus(st *status.Status) error { switch errDetails.(type) { case *failure.MultiOperationExecutionAborted: return newMultiOperationAborted(st) + case *errordetails.WorkflowTaskCompletionBufferLostFailure: + return newWorkflowTaskBufferLost(st) default: return newAborted(st) } diff --git a/serviceerror/convert_test.go b/serviceerror/convert_test.go index 89c53344..13094ca2 100644 --- a/serviceerror/convert_test.go +++ b/serviceerror/convert_test.go @@ -191,6 +191,22 @@ func TestMultiOperationAborted(t *testing.T) { require.True(t, proto.Equal(st.Proto(), reconstructedStatus.Proto())) } +func TestWorkflowTaskBufferLost(t *testing.T) { + err := serviceerror.NewWorkflowTaskBufferLost("buffer lost") + + st := serviceerror.ToStatus(err) + require.Equal(t, codes.Aborted, st.Code()) + require.Equal(t, err.Error(), st.Message()) + require.Len(t, st.Details(), 1) + + errFromStatus := serviceerror.FromStatus(st) + require.IsType(t, &serviceerror.WorkflowTaskBufferLost{}, errFromStatus) + require.Equal(t, err.Error(), errFromStatus.Error()) + + reconstructedStatus := serviceerror.ToStatus(errFromStatus) + require.True(t, proto.Equal(st.Proto(), reconstructedStatus.Proto())) +} + func TestFromWrapped(t *testing.T) { err := &serviceerror.PermissionDenied{ Message: "x is not allowed", diff --git a/serviceerror/workflow_task_buffer_lost.go b/serviceerror/workflow_task_buffer_lost.go new file mode 100644 index 00000000..f7207b87 --- /dev/null +++ b/serviceerror/workflow_task_buffer_lost.go @@ -0,0 +1,56 @@ +package serviceerror + +import ( + "fmt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "go.temporal.io/api/errordetails/v1" +) + +type ( + // WorkflowTaskBufferLost represents a lost buffer during processing of a pagination requestt. + WorkflowTaskBufferLost struct { + Message string + st *status.Status + } +) + +// NewWorkflowTaskBufferLost returns a new WorkflowTaskBufferLost error. +func NewWorkflowTaskBufferLost(message string) error { + return &WorkflowTaskBufferLost{ + Message: message, + } +} + +// NewWorkflowTaskBufferLostf returns a new WorkflowTaskBufferLost error with a formatted message. +func NewWorkflowTaskBufferLostf(format string, args ...any) error { + return &WorkflowTaskBufferLost{ + Message: fmt.Sprintf(format, args...), + } +} + +// Error returns string message. +func (e *WorkflowTaskBufferLost) Error() string { + return e.Message +} + +func (e *WorkflowTaskBufferLost) Status() *status.Status { + if e.st != nil { + return e.st + } + + st := status.New(codes.Aborted, e.Message) + st, _ = st.WithDetails( + &errordetails.WorkflowTaskCompletionBufferLostFailure{}, + ) + return st +} + +func newWorkflowTaskBufferLost(st *status.Status) error { + return &WorkflowTaskBufferLost{ + Message: st.Message(), + st: st, + } +} From 04e6b20b37017abf26fbf7250fefae336fd6198a Mon Sep 17 00:00:00 2001 From: Vladyslav Simonenko Date: Wed, 8 Jul 2026 15:01:49 -0700 Subject: [PATCH 2/2] Address comments --- serviceerror/convert.go | 2 +- serviceerror/convert_test.go | 6 +- serviceerror/workflow_task_buffer_lost.go | 56 ------------------ .../workflow_task_completion_buffer_lost.go | 58 +++++++++++++++++++ 4 files changed, 62 insertions(+), 60 deletions(-) delete mode 100644 serviceerror/workflow_task_buffer_lost.go create mode 100644 serviceerror/workflow_task_completion_buffer_lost.go diff --git a/serviceerror/convert.go b/serviceerror/convert.go index dc2d5596..31926e01 100644 --- a/serviceerror/convert.go +++ b/serviceerror/convert.go @@ -94,7 +94,7 @@ func FromStatus(st *status.Status) error { case *failure.MultiOperationExecutionAborted: return newMultiOperationAborted(st) case *errordetails.WorkflowTaskCompletionBufferLostFailure: - return newWorkflowTaskBufferLost(st) + return newWorkflowTaskCompletionBufferLost(st) default: return newAborted(st) } diff --git a/serviceerror/convert_test.go b/serviceerror/convert_test.go index 13094ca2..5a86b70f 100644 --- a/serviceerror/convert_test.go +++ b/serviceerror/convert_test.go @@ -191,8 +191,8 @@ func TestMultiOperationAborted(t *testing.T) { require.True(t, proto.Equal(st.Proto(), reconstructedStatus.Proto())) } -func TestWorkflowTaskBufferLost(t *testing.T) { - err := serviceerror.NewWorkflowTaskBufferLost("buffer lost") +func TestWorkflowTaskCompletionBufferLost(t *testing.T) { + err := serviceerror.NewWorkflowTaskCompletionBufferLost("buffer lost") st := serviceerror.ToStatus(err) require.Equal(t, codes.Aborted, st.Code()) @@ -200,7 +200,7 @@ func TestWorkflowTaskBufferLost(t *testing.T) { require.Len(t, st.Details(), 1) errFromStatus := serviceerror.FromStatus(st) - require.IsType(t, &serviceerror.WorkflowTaskBufferLost{}, errFromStatus) + require.IsType(t, &serviceerror.WorkflowTaskCompletionBufferLost{}, errFromStatus) require.Equal(t, err.Error(), errFromStatus.Error()) reconstructedStatus := serviceerror.ToStatus(errFromStatus) diff --git a/serviceerror/workflow_task_buffer_lost.go b/serviceerror/workflow_task_buffer_lost.go deleted file mode 100644 index f7207b87..00000000 --- a/serviceerror/workflow_task_buffer_lost.go +++ /dev/null @@ -1,56 +0,0 @@ -package serviceerror - -import ( - "fmt" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "go.temporal.io/api/errordetails/v1" -) - -type ( - // WorkflowTaskBufferLost represents a lost buffer during processing of a pagination requestt. - WorkflowTaskBufferLost struct { - Message string - st *status.Status - } -) - -// NewWorkflowTaskBufferLost returns a new WorkflowTaskBufferLost error. -func NewWorkflowTaskBufferLost(message string) error { - return &WorkflowTaskBufferLost{ - Message: message, - } -} - -// NewWorkflowTaskBufferLostf returns a new WorkflowTaskBufferLost error with a formatted message. -func NewWorkflowTaskBufferLostf(format string, args ...any) error { - return &WorkflowTaskBufferLost{ - Message: fmt.Sprintf(format, args...), - } -} - -// Error returns string message. -func (e *WorkflowTaskBufferLost) Error() string { - return e.Message -} - -func (e *WorkflowTaskBufferLost) Status() *status.Status { - if e.st != nil { - return e.st - } - - st := status.New(codes.Aborted, e.Message) - st, _ = st.WithDetails( - &errordetails.WorkflowTaskCompletionBufferLostFailure{}, - ) - return st -} - -func newWorkflowTaskBufferLost(st *status.Status) error { - return &WorkflowTaskBufferLost{ - Message: st.Message(), - st: st, - } -} diff --git a/serviceerror/workflow_task_completion_buffer_lost.go b/serviceerror/workflow_task_completion_buffer_lost.go new file mode 100644 index 00000000..f2b7d309 --- /dev/null +++ b/serviceerror/workflow_task_completion_buffer_lost.go @@ -0,0 +1,58 @@ +package serviceerror + +import ( + "fmt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "go.temporal.io/api/errordetails/v1" +) + +type ( + // WorkflowTaskCompletionBufferLost represents a lost buffer during processing of a + // paginated workflow task completion request. Clients should restart pagination by + // resending all pages from page 0 with the same task token. + WorkflowTaskCompletionBufferLost struct { + Message string + st *status.Status + } +) + +// NewWorkflowTaskCompletionBufferLost returns a new WorkflowTaskCompletionBufferLost error. +func NewWorkflowTaskCompletionBufferLost(message string) error { + return &WorkflowTaskCompletionBufferLost{ + Message: message, + } +} + +// NewWorkflowTaskCompletionBufferLostf returns a new WorkflowTaskCompletionBufferLost error with a formatted message. +func NewWorkflowTaskCompletionBufferLostf(format string, args ...any) error { + return &WorkflowTaskCompletionBufferLost{ + Message: fmt.Sprintf(format, args...), + } +} + +// Error returns string message. +func (e *WorkflowTaskCompletionBufferLost) Error() string { + return e.Message +} + +func (e *WorkflowTaskCompletionBufferLost) Status() *status.Status { + if e.st != nil { + return e.st + } + + st := status.New(codes.Aborted, e.Message) + st, _ = st.WithDetails( + &errordetails.WorkflowTaskCompletionBufferLostFailure{}, + ) + return st +} + +func newWorkflowTaskCompletionBufferLost(st *status.Status) error { + return &WorkflowTaskCompletionBufferLost{ + Message: st.Message(), + st: st, + } +}