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..31d98ad7b 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.QueryRejected { + return q.queryRejected +} + +func (q *QueryRejectedError) Error() string { return fmt.Sprintf("query rejected: %s", q.queryRejected.Status.String()) } 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 (