@@ -332,7 +332,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandScheduleActivity(
332
332
return nil , handler .failWorkflow (enumspb .WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES , err )
333
333
}
334
334
if err := handler .sizeLimitChecker .checkIfNumPendingActivitiesExceedsLimit (); err != nil {
335
- return nil , handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_ACTIVITIES_LIMIT_EXCEEDED , err )
335
+ return nil , handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_ACTIVITIES_LIMIT_EXCEEDED , err )
336
336
}
337
337
338
338
enums .SetDefaultTaskQueueKind (& attr .GetTaskQueue ().Kind )
@@ -349,10 +349,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandScheduleActivity(
349
349
eagerStartActivity ,
350
350
)
351
351
if err != nil {
352
- if _ , ok := err .(* serviceerror.InvalidArgument ); ok {
353
- return nil , handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_SCHEDULE_ACTIVITY_DUPLICATE_ID , err )
354
- }
355
- return nil , err
352
+ return nil , handler .failWorkflowTaskOnInvalidArgument (enumspb .WORKFLOW_TASK_FAILED_CAUSE_SCHEDULE_ACTIVITY_DUPLICATE_ID , err )
356
353
}
357
354
358
355
if ! eagerStartActivity {
@@ -473,10 +470,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandRequestCancelActivity(
473
470
handler .identity ,
474
471
)
475
472
if err != nil {
476
- if _ , ok := err .(* serviceerror.InvalidArgument ); ok {
477
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES , err )
478
- }
479
- return err
473
+ return handler .failWorkflowTaskOnInvalidArgument (enumspb .WORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES , err )
480
474
}
481
475
if ai != nil {
482
476
// If ai is nil, the activity has already been canceled/completed/timedout. The cancel request
@@ -518,10 +512,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandStartTimer(
518
512
519
513
_ , _ , err := handler .mutableState .AddTimerStartedEvent (handler .workflowTaskCompletedID , attr )
520
514
if err != nil {
521
- if _ , ok := err .(* serviceerror.InvalidArgument ); ok {
522
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID , err )
523
- }
524
- return err
515
+ return handler .failWorkflowTaskOnInvalidArgument (enumspb .WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID , err )
525
516
}
526
517
return nil
527
518
}
@@ -534,11 +525,11 @@ func (handler *workflowTaskHandlerImpl) handleCommandCompleteWorkflow(
534
525
handler .metricsHandler .Counter (metrics .CommandTypeCompleteWorkflowCounter .GetMetricName ()).Record (1 )
535
526
536
527
if handler .hasBufferedEvents {
537
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
528
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
538
529
}
539
530
540
531
if handler .hasPendingUpdates {
541
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
532
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
542
533
}
543
534
544
535
if err := handler .validateCommandAttr (
@@ -596,11 +587,11 @@ func (handler *workflowTaskHandlerImpl) handleCommandFailWorkflow(
596
587
handler .metricsHandler .Counter (metrics .CommandTypeFailWorkflowCounter .GetMetricName ()).Record (1 )
597
588
598
589
if handler .hasBufferedEvents {
599
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
590
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
600
591
}
601
592
602
593
if handler .hasPendingUpdates {
603
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
594
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
604
595
}
605
596
606
597
if err := handler .validateCommandAttr (
@@ -685,10 +676,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandCancelTimer(
685
676
attr ,
686
677
handler .identity )
687
678
if err != nil {
688
- if _ , ok := err .(* serviceerror.InvalidArgument ); ok {
689
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES , err )
690
- }
691
- return err
679
+ return handler .failWorkflowTaskOnInvalidArgument (enumspb .WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES , err )
692
680
}
693
681
694
682
// timer deletion is a success, we may have deleted a fired timer in
@@ -707,11 +695,11 @@ func (handler *workflowTaskHandlerImpl) handleCommandCancelWorkflow(
707
695
handler .metricsHandler .Counter (metrics .CommandTypeCancelWorkflowCounter .GetMetricName ()).Record (1 )
708
696
709
697
if handler .hasBufferedEvents {
710
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
698
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
711
699
}
712
700
713
701
if handler .hasPendingUpdates {
714
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
702
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
715
703
}
716
704
717
705
if err := handler .validateCommandAttr (
@@ -768,7 +756,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandRequestCancelExternalWorkfl
768
756
return err
769
757
}
770
758
if err := handler .sizeLimitChecker .checkIfNumPendingCancelRequestsExceedsLimit (); err != nil {
771
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_REQUEST_CANCEL_LIMIT_EXCEEDED , err )
759
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_REQUEST_CANCEL_LIMIT_EXCEEDED , err )
772
760
}
773
761
774
762
cancelRequestID := uuid .New ()
@@ -814,11 +802,11 @@ func (handler *workflowTaskHandlerImpl) handleCommandContinueAsNewWorkflow(
814
802
handler .metricsHandler .Counter (metrics .CommandTypeContinueAsNewCounter .GetMetricName ()).Record (1 )
815
803
816
804
if handler .hasBufferedEvents {
817
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
805
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND , nil )
818
806
}
819
807
820
808
if handler .hasPendingUpdates {
821
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
809
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_UPDATE , nil )
822
810
}
823
811
824
812
namespaceName := handler .mutableState .GetNamespaceEntry ().Name ()
@@ -991,7 +979,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandStartChildWorkflow(
991
979
992
980
// child workflow limit
993
981
if err := handler .sizeLimitChecker .checkIfNumChildWorkflowsExceedsLimit (); err != nil {
994
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_CHILD_WORKFLOWS_LIMIT_EXCEEDED , err )
982
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_CHILD_WORKFLOWS_LIMIT_EXCEEDED , err )
995
983
}
996
984
997
985
enabled := handler .config .EnableParentClosePolicy (parentNamespace .String ())
@@ -1044,7 +1032,7 @@ func (handler *workflowTaskHandlerImpl) handleCommandSignalExternalWorkflow(
1044
1032
return err
1045
1033
}
1046
1034
if err := handler .sizeLimitChecker .checkIfNumPendingSignalsExceedsLimit (); err != nil {
1047
- return handler .failCommand (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_SIGNALS_LIMIT_EXCEEDED , err )
1035
+ return handler .failWorkflowTask (enumspb .WORKFLOW_TASK_FAILED_CAUSE_PENDING_SIGNALS_LIMIT_EXCEEDED , err )
1048
1036
}
1049
1037
1050
1038
if err := handler .sizeLimitChecker .checkIfPayloadSizeExceedsLimit (
@@ -1423,49 +1411,68 @@ func (handler *workflowTaskHandlerImpl) validateCommandAttr(
1423
1411
validationFn commandAttrValidationFn ,
1424
1412
) error {
1425
1413
1426
- if failedCause , err := validationFn (); err != nil {
1427
- if _ , ok := err .(* serviceerror.InvalidArgument ); ok {
1428
- return handler .failCommand (failedCause , err )
1429
- }
1414
+ return handler .failWorkflowTaskOnInvalidArgument (validationFn ())
1415
+ }
1416
+
1417
+ func (handler * workflowTaskHandlerImpl ) failWorkflowTaskOnInvalidArgument (
1418
+ wtFailedCause enumspb.WorkflowTaskFailedCause ,
1419
+ err error ,
1420
+ ) error {
1421
+
1422
+ switch err .(type ) {
1423
+ case * serviceerror.InvalidArgument :
1424
+ return handler .failWorkflowTask (wtFailedCause , err )
1425
+ default :
1430
1426
return err
1431
1427
}
1432
-
1433
- return nil
1434
1428
}
1435
1429
1436
- func (handler * workflowTaskHandlerImpl ) failCommand (
1430
+ func (handler * workflowTaskHandlerImpl ) failWorkflowTask (
1437
1431
failedCause enumspb.WorkflowTaskFailedCause ,
1438
1432
causeErr error ,
1439
1433
) error {
1440
- handler .workflowTaskFailedCause = NewWorkflowTaskFailedCause (failedCause , causeErr )
1434
+
1435
+ handler .workflowTaskFailedCause = newWorkflowTaskFailedCause (
1436
+ failedCause ,
1437
+ causeErr ,
1438
+ nil )
1441
1439
handler .stopProcessing = true
1440
+ // NOTE: failWorkflowTask always return nil.
1441
+ // It is important to clear returned error if WT needs to be failed to properly add WTFailed event.
1442
+ // Handler will rely on stopProcessing flag and workflowTaskFailedCause field.
1442
1443
return nil
1443
1444
}
1444
1445
1445
1446
func (handler * workflowTaskHandlerImpl ) failWorkflow (
1446
1447
failedCause enumspb.WorkflowTaskFailedCause ,
1447
1448
causeErr error ,
1448
1449
) error {
1449
- handler . workflowTaskFailedCause = & workflowTaskFailedCause {
1450
- failedCause : failedCause ,
1451
- causeErr : causeErr ,
1452
- workflowFailure : failure . NewServerFailure ( causeErr . Error (), true ) ,
1453
- }
1450
+
1451
+ handler . workflowTaskFailedCause = newWorkflowTaskFailedCause (
1452
+ failedCause ,
1453
+ causeErr ,
1454
+ failure . NewServerFailure ( causeErr . Error (), true ))
1454
1455
handler .stopProcessing = true
1456
+ // NOTE: failWorkflow always return nil.
1457
+ // It is important to clear returned error if WT needs to be failed to properly add WTFailed and FailWorkflow events.
1458
+ // Handler will rely on stopProcessing flag and workflowTaskFailedCause field.
1455
1459
return nil
1456
1460
}
1457
1461
1458
- func NewWorkflowTaskFailedCause (failedCause enumspb.WorkflowTaskFailedCause , causeErr error ) * workflowTaskFailedCause {
1462
+ func newWorkflowTaskFailedCause (failedCause enumspb.WorkflowTaskFailedCause , causeErr error , workflowFailure * failurepb.Failure ) * workflowTaskFailedCause {
1463
+
1459
1464
return & workflowTaskFailedCause {
1460
- failedCause : failedCause ,
1461
- causeErr : causeErr ,
1465
+ failedCause : failedCause ,
1466
+ causeErr : causeErr ,
1467
+ workflowFailure : workflowFailure ,
1462
1468
}
1463
1469
}
1464
1470
1465
- func (wtfc * workflowTaskFailedCause ) Message () string {
1466
- if wtfc .causeErr == nil {
1467
- return wtfc .failedCause .String ()
1471
+ func (c * workflowTaskFailedCause ) Message () string {
1472
+
1473
+ if c .causeErr == nil {
1474
+ return c .failedCause .String ()
1468
1475
}
1469
1476
1470
- return fmt .Sprintf ("%v: %v" , wtfc .failedCause , wtfc .causeErr .Error ())
1477
+ return fmt .Sprintf ("%v: %v" , c .failedCause , c .causeErr .Error ())
1471
1478
}
0 commit comments