@@ -386,9 +386,11 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
386
386
metrics .OperationTag (metrics .HistoryRespondWorkflowTaskCompletedScope ))
387
387
}
388
388
389
- workflowTaskHeartbeating := request .GetForceCreateNewWorkflowTask () && len (request .Commands ) == 0
389
+ workflowTaskHeartbeating := request .GetForceCreateNewWorkflowTask () && len (request .Commands ) == 0 && len ( request . Messages ) == 0
390
390
var workflowTaskHeartbeatTimeout bool
391
391
var completedEvent * historypb.HistoryEvent
392
+ var responseMutations []workflowTaskResponseMutation
393
+
392
394
if workflowTaskHeartbeating {
393
395
namespace := namespaceEntry .Name ()
394
396
timeout := handler .config .WorkflowTaskHeartbeatTimeout (namespace .String ())
@@ -423,11 +425,8 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
423
425
wtFailedCause * workflowTaskFailedCause
424
426
activityNotStartedCancelled bool
425
427
newMutableState workflow.MutableState
426
-
427
- hasUnhandledEvents bool
428
- responseMutations []workflowTaskResponseMutation
429
428
)
430
- hasUnhandledEvents = ms .HasBufferedEvents ()
429
+ hasBufferedEvents : = ms .HasBufferedEvents ()
431
430
432
431
if request .StickyAttributes == nil || request .StickyAttributes .WorkerTaskQueue == nil {
433
432
handler .metricsHandler .Counter (metrics .CompleteWorkflowTaskWithStickyDisabledCounter .GetMetricName ()).Record (
@@ -481,7 +480,7 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
481
480
handler .config ,
482
481
handler .shard ,
483
482
handler .searchAttributesMapper ,
484
- hasUnhandledEvents ,
483
+ hasBufferedEvents ,
485
484
)
486
485
487
486
if responseMutations , err = workflowTaskHandler .handleCommands (
@@ -491,6 +490,13 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
491
490
return nil , err
492
491
}
493
492
493
+ if err = workflowTaskHandler .handleMessages (
494
+ ctx ,
495
+ request .Messages ,
496
+ ); err != nil {
497
+ return nil , err
498
+ }
499
+
494
500
// set the vars used by following logic
495
501
// further refactor should also clean up the vars used below
496
502
wtFailedCause = workflowTaskHandler .workflowTaskFailedCause
@@ -501,7 +507,7 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
501
507
502
508
newMutableState = workflowTaskHandler .newMutableState
503
509
504
- hasUnhandledEvents = workflowTaskHandler .hasBufferedEvents
510
+ hasBufferedEvents = workflowTaskHandler .hasBufferedEvents
505
511
}
506
512
507
513
if wtFailedCause != nil {
@@ -522,7 +528,7 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
522
528
if err != nil {
523
529
return nil , err
524
530
}
525
- hasUnhandledEvents = true
531
+ hasBufferedEvents = true
526
532
newMutableState = nil
527
533
528
534
if wtFailedCause .workflowFailure != nil {
@@ -532,24 +538,37 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
532
538
if _ , err := ms .AddFailWorkflowEvent (nextEventBatchId , enumspb .RETRY_STATE_NON_RETRYABLE_FAILURE , attributes , "" ); err != nil {
533
539
return nil , err
534
540
}
535
- hasUnhandledEvents = false
541
+ hasBufferedEvents = false
536
542
}
537
543
}
538
544
539
- createNewWorkflowTask := ms .IsWorkflowExecutionRunning () && (hasUnhandledEvents || request .GetForceCreateNewWorkflowTask () || activityNotStartedCancelled )
545
+ newWorkflowTaskType := enumsspb .WORKFLOW_TASK_TYPE_UNSPECIFIED
546
+ if ms .IsWorkflowExecutionRunning () && (hasBufferedEvents || request .GetForceCreateNewWorkflowTask () || activityNotStartedCancelled ) {
547
+ newWorkflowTaskType = enumsspb .WORKFLOW_TASK_TYPE_NORMAL
548
+ }
549
+ createNewWorkflowTask := newWorkflowTaskType != enumsspb .WORKFLOW_TASK_TYPE_UNSPECIFIED
550
+
540
551
var newWorkflowTaskScheduledEventID int64
541
552
if createNewWorkflowTask {
553
+ // TODO (alex-update): Need to support case when ReturnNewWorkflowTask=false and WT.Type=Speculative.
554
+ // In this case WT needs to be added directly to matching.
555
+ // Current implementation will create normal WT.
542
556
bypassTaskGeneration := request .GetReturnNewWorkflowTask () && wtFailedCause == nil
557
+ if ! bypassTaskGeneration {
558
+ // If task generation can't be bypassed workflow task must be of Normal type because Speculative workflow task always skip task generation.
559
+ newWorkflowTaskType = enumsspb .WORKFLOW_TASK_TYPE_NORMAL
560
+ }
561
+
543
562
var newWorkflowTask * workflow.WorkflowTaskInfo
544
563
var err error
545
564
if workflowTaskHeartbeating && ! workflowTaskHeartbeatTimeout {
546
565
newWorkflowTask , err = ms .AddWorkflowTaskScheduledEventAsHeartbeat (
547
566
bypassTaskGeneration ,
548
567
currentWorkflowTask .OriginalScheduledTime ,
549
- enumsspb .WORKFLOW_TASK_TYPE_NORMAL ,
568
+ enumsspb .WORKFLOW_TASK_TYPE_NORMAL , // Heartbeat workflow task is always of Normal type.
550
569
)
551
570
} else {
552
- newWorkflowTask , err = ms .AddWorkflowTaskScheduledEvent (bypassTaskGeneration , enumsspb . WORKFLOW_TASK_TYPE_NORMAL )
571
+ newWorkflowTask , err = ms .AddWorkflowTaskScheduledEvent (bypassTaskGeneration , newWorkflowTaskType )
553
572
}
554
573
if err != nil {
555
574
return nil , err
@@ -661,7 +680,6 @@ func (handler *workflowTaskHandlerCallbacksImpl) handleWorkflowTaskCompleted(
661
680
}
662
681
663
682
return resp , nil
664
-
665
683
}
666
684
667
685
func (handler * workflowTaskHandlerCallbacksImpl ) verifyFirstWorkflowTaskScheduled (
0 commit comments