From 578c2a1d44b2a4fd3a0318a14a7b4cde7e42c85b Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Fri, 30 Aug 2024 17:20:57 -0700 Subject: [PATCH 1/3] Expose QueryRejectedError --- interceptor/interceptor.go | 4 ++++ internal/interceptor.go | 1 + internal/internal_workflow_client.go | 17 +++++++++++------ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/interceptor/interceptor.go b/interceptor/interceptor.go index aa269ca5c..87fe15adb 100644 --- a/interceptor/interceptor.go +++ b/interceptor/interceptor.go @@ -220,6 +220,10 @@ type ScheduleClientCreateInput = internal.ScheduleClientCreateInput // ClientOutoundInterceptor.UpdateWorkflow. type ClientUpdateWorkflowInput = internal.ClientUpdateWorkflowInput +// QueryRejectedError is a possible error that can be returned by +// ClientOutboundInterceptor.QueryWorkflow to indicate that the query was rejected by the server. +type QueryRejectedError = internal.QueryRejectedError + // Header provides Temporal header information from the context for reading or // writing during specific interceptor calls. // diff --git a/internal/interceptor.go b/internal/interceptor.go index b94e9780b..db110074c 100644 --- a/internal/interceptor.go +++ b/internal/interceptor.go @@ -375,6 +375,7 @@ type ClientOutboundInterceptor interface { TerminateWorkflow(context.Context, *ClientTerminateWorkflowInput) error // QueryWorkflow intercepts client.Client.QueryWorkflow. + // If the query is rejected, QueryWorkflow will return an QueryRejectedError // interceptor.Header will return a non-nil map for this context. QueryWorkflow(context.Context, *ClientQueryWorkflowInput) (converter.EncodedValue, error) diff --git a/internal/internal_workflow_client.go b/internal/internal_workflow_client.go index 59c92a517..306e097ff 100644 --- a/internal/internal_workflow_client.go +++ b/internal/internal_workflow_client.go @@ -214,8 +214,8 @@ type ( paginate func(nexttoken []byte) (*workflowservice.GetWorkflowExecutionHistoryResponse, error) } - // queryRejectedError is a wrapper for QueryRejected - queryRejectedError struct { + // QueryRejectedError is a wrapper for QueryRejected + QueryRejectedError struct { queryRejected *querypb.QueryRejected } ) @@ -924,9 +924,10 @@ func (wc *WorkflowClient) QueryWorkflowWithOptions(ctx context.Context, request QueryRejectCondition: request.QueryRejectCondition, }) if err != nil { - if err, ok := err.(*queryRejectedError); ok { + var qerr *QueryRejectedError + if errors.As(err, &qerr) { return &QueryWorkflowWithOptionsResponse{ - QueryRejected: err.queryRejected, + QueryRejected: qerr.QueryRejected(), }, nil } return nil, err @@ -1994,7 +1995,7 @@ func (w *workflowClientInterceptor) QueryWorkflow( } if resp.QueryRejected != nil { - return nil, &queryRejectedError{ + return nil, &QueryRejectedError{ queryRejected: resp.QueryRejected, } } @@ -2241,7 +2242,11 @@ func (luh *lazyUpdateHandle) Get(ctx context.Context, valuePtr interface{}) erro return resp.Result.Get(valuePtr) } -func (q *queryRejectedError) Error() string { +func (q *QueryRejectedError) QueryRejected() *querypb.Rejected { + return q.queryRejected +} + +func (q *QueryRejectedError) Error() string { return fmt.Sprintf("query rejected: %s", q.queryRejected.Status.String()) } From 6a8e646f3753ced1e75a122a52890b86597196b4 Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Fri, 30 Aug 2024 17:23:55 -0700 Subject: [PATCH 2/3] Fix type --- internal/internal_workflow_client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/internal_workflow_client.go b/internal/internal_workflow_client.go index 306e097ff..31d98ad7b 100644 --- a/internal/internal_workflow_client.go +++ b/internal/internal_workflow_client.go @@ -2242,7 +2242,7 @@ func (luh *lazyUpdateHandle) Get(ctx context.Context, valuePtr interface{}) erro return resp.Result.Get(valuePtr) } -func (q *QueryRejectedError) QueryRejected() *querypb.Rejected { +func (q *QueryRejectedError) QueryRejected() *querypb.QueryRejected { return q.queryRejected } From 7757a56130a2732e4cebf08391ccfd6b10b7e6c3 Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Tue, 3 Sep 2024 08:54:45 -0700 Subject: [PATCH 3/3] Move QueryRejectedError to temporal package --- interceptor/interceptor.go | 4 ---- temporal/error.go | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interceptor/interceptor.go b/interceptor/interceptor.go index 87fe15adb..aa269ca5c 100644 --- a/interceptor/interceptor.go +++ b/interceptor/interceptor.go @@ -220,10 +220,6 @@ type ScheduleClientCreateInput = internal.ScheduleClientCreateInput // ClientOutoundInterceptor.UpdateWorkflow. type ClientUpdateWorkflowInput = internal.ClientUpdateWorkflowInput -// QueryRejectedError is a possible error that can be returned by -// ClientOutboundInterceptor.QueryWorkflow to indicate that the query was rejected by the server. -type QueryRejectedError = internal.QueryRejectedError - // Header provides Temporal header information from the context for reading or // writing during specific interceptor calls. // diff --git a/temporal/error.go b/temporal/error.go index 3f14b41b9..736b47701 100644 --- a/temporal/error.go +++ b/temporal/error.go @@ -158,6 +158,10 @@ type ( // UnknownExternalWorkflowExecutionError can be returned when external workflow doesn't exist UnknownExternalWorkflowExecutionError = internal.UnknownExternalWorkflowExecutionError + + // QueryRejectedError is a possible error that can be returned by + // ClientOutboundInterceptor.QueryWorkflow to indicate that the query was rejected by the server. + QueryRejectedError = internal.QueryRejectedError ) var (