@@ -76,21 +76,18 @@ func NewStandaloneActivity(
7676 visibility := chasm .NewVisibilityWithData (
7777 ctx ,
7878 request .GetSearchAttributes ().GetIndexedFields (),
79- request . GetMemo (). GetFields () ,
79+ nil ,
8080 )
8181
82- // TODO flatten this when API is updated
83- options := request .GetOptions ()
84-
8582 activity := & Activity {
8683 ActivityState : & activitypb.ActivityState {
8784 ActivityType : request .ActivityType ,
88- TaskQueue : options .GetTaskQueue (),
89- ScheduleToCloseTimeout : options .GetScheduleToCloseTimeout (),
90- ScheduleToStartTimeout : options .GetScheduleToStartTimeout (),
91- StartToCloseTimeout : options .GetStartToCloseTimeout (),
92- HeartbeatTimeout : options .GetHeartbeatTimeout (),
93- RetryPolicy : options .GetRetryPolicy (),
85+ TaskQueue : request .GetTaskQueue (),
86+ ScheduleToCloseTimeout : request .GetScheduleToCloseTimeout (),
87+ ScheduleToStartTimeout : request .GetScheduleToStartTimeout (),
88+ StartToCloseTimeout : request .GetStartToCloseTimeout (),
89+ HeartbeatTimeout : request .GetHeartbeatTimeout (),
90+ RetryPolicy : request .GetRetryPolicy (),
9491 Priority : request .Priority ,
9592 },
9693 LastAttempt : chasm .NewDataField (ctx , & activitypb.ActivityAttemptState {}),
@@ -103,7 +100,7 @@ func NewStandaloneActivity(
103100 Visibility : chasm .NewComponentField (ctx , visibility ),
104101 }
105102
106- activity .ScheduledTime = timestamppb .New (ctx .Now (activity ))
103+ activity .ScheduleTime = timestamppb .New (ctx .Now (activity ))
107104
108105 return activity , nil
109106}
@@ -355,7 +352,6 @@ func (a *Activity) recordFailedAttempt(
355352 failure * failurepb.Failure ,
356353 noRetriesLeft bool ,
357354) error {
358- outcome := a .Outcome .Get (ctx )
359355 attempt := a .LastAttempt .Get (ctx )
360356 currentTime := timestamppb .New (ctx .Now (a ))
361357
@@ -368,7 +364,6 @@ func (a *Activity) recordFailedAttempt(
368364 // If the activity has exhausted retries, mark the outcome failure as well but don't store duplicate failure info.
369365 // Also reset the retry interval as there won't be any more retries.
370366 if noRetriesLeft {
371- outcome .Variant = & activitypb.ActivityOutcome_Failed_ {}
372367 attempt .CurrentRetryInterval = nil
373368 } else {
374369 attempt .CurrentRetryInterval = durationpb .New (retryInterval )
@@ -407,7 +402,7 @@ func (a *Activity) hasEnoughTimeForRetry(ctx chasm.Context, overridingRetryInter
407402 return true , retryInterval , nil
408403 }
409404
410- deadline := a .ScheduledTime .AsTime ().Add (scheduleToClose )
405+ deadline := a .ScheduleTime .AsTime ().Add (scheduleToClose )
411406 return ctx .Now (a ).Add (retryInterval ).Before (deadline ), retryInterval , nil
412407}
413408
@@ -486,83 +481,96 @@ func (a *Activity) buildActivityExecutionInfo(ctx chasm.Context) (*activity.Acti
486481 Priority : a .GetPriority (),
487482 RunId : key .RunID ,
488483 RunState : runState ,
489- ScheduledTime : a . GetScheduledTime (),
484+ ScheduleTime : a . GetScheduleTime (),
490485 Status : status ,
491486 // TODO(dan): populate remaining fields
492487 }
493488
494489 return info , nil
495490}
496491
497- func (a * Activity ) buildPollActivityExecutionResponse (
492+ func (a * Activity ) buildDescribeActivityExecutionResponse (
498493 ctx chasm.Context ,
499- req * activitypb.PollActivityExecutionRequest ,
500- ) (* activitypb.PollActivityExecutionResponse , error ) {
494+ req * activitypb.DescribeActivityExecutionRequest ,
495+ ) (* activitypb.DescribeActivityExecutionResponse , error ) {
501496 request := req .GetFrontendRequest ()
502497
503498 token , err := ctx .Ref (a )
504499 if err != nil {
505500 return nil , err
506501 }
507502
508- var info * activity.ActivityExecutionInfo
509- if request .GetIncludeInfo () {
510- info , err = a .buildActivityExecutionInfo (ctx )
511- if err != nil {
512- return nil , err
513- }
503+ info , err := a .buildActivityExecutionInfo (ctx )
504+ if err != nil {
505+ return nil , err
514506 }
515507
516508 var input * commonpb.Payloads
517509 if request .GetIncludeInput () {
518- activityRequest := a .RequestData .Get (ctx )
519- input = activityRequest .GetInput ()
510+ input = a .RequestData .Get (ctx ).GetInput ()
520511 }
521512
522- response := & workflowservice.PollActivityExecutionResponse {
523- Info : info ,
524- RunId : ctx .ExecutionKey ().RunID ,
525- Input : input ,
526- StateChangeLongPollToken : token ,
513+ response := & workflowservice.DescribeActivityExecutionResponse {
514+ Info : info ,
515+ RunId : ctx .ExecutionKey ().RunID ,
516+ Input : input ,
517+ LongPollToken : token ,
527518 }
528519
529520 if request .GetIncludeOutcome () {
530- activityOutcome := a .Outcome .Get (ctx )
531- // There are two places where a failure might be stored but only one place where a
532- // successful outcome is stored.
533- if successful := activityOutcome .GetSuccessful (); successful != nil {
534- response .Outcome = & workflowservice.PollActivityExecutionResponse_Result {
535- Result : successful .GetOutput (),
536- }
537- } else if failure := activityOutcome .GetFailed ().GetFailure (); failure != nil {
538- response .Outcome = & workflowservice.PollActivityExecutionResponse_Failure {
539- Failure : failure ,
540- }
541- } else {
542- shouldHaveFailure := (a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_FAILED ||
543- a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_TIMED_OUT ||
544- a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_CANCELED ||
545- a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_TERMINATED )
546-
547- if shouldHaveFailure {
548- attempt := a .LastAttempt .Get (ctx )
549- if details := attempt .GetLastFailureDetails (); details != nil {
550- response .Outcome = & workflowservice.PollActivityExecutionResponse_Failure {
551- Failure : details .GetFailure (),
552- }
553- }
554- }
555- }
521+ response .Outcome = a .outcome (ctx )
556522 }
557523
558- return & activitypb.PollActivityExecutionResponse {
524+ return & activitypb.DescribeActivityExecutionResponse {
559525 FrontendResponse : response ,
560526 }, nil
561527}
562528
563- // StoreOrSelf returns the store for the activity. If the store is not set as a field (e.g. standalone
564- // activities), it returns the activity itself.
565- func (a * Activity ) StoreOrSelf (ctx chasm.MutableContext ) ActivityStore {
529+ func (a * Activity ) buildGetActivityExecutionOutcomeResponse (
530+ ctx chasm.Context ,
531+ ) (* activitypb.GetActivityExecutionOutcomeResponse , error ) {
532+ return & activitypb.GetActivityExecutionOutcomeResponse {
533+ FrontendResponse : & workflowservice.GetActivityExecutionOutcomeResponse {
534+ RunId : ctx .ExecutionKey ().RunID ,
535+ Outcome : a .outcome (ctx ),
536+ },
537+ }, nil
538+ }
539+
540+ // outcome retrieves the activity outcome (result or failure) if the activity has completed.
541+ // Returns nil if the activity has not completed.
542+ func (a * Activity ) outcome (ctx chasm.Context ) * activity.ActivityExecutionOutcome {
543+ activityOutcome := a .Outcome .Get (ctx )
544+ // Check for successful outcome
545+ if successful := activityOutcome .GetSuccessful (); successful != nil {
546+ return & activity.ActivityExecutionOutcome {
547+ Value : & activity.ActivityExecutionOutcome_Result {Result : successful .GetOutput ()},
548+ }
549+ }
550+ // Check for failure in outcome
551+ if failure := activityOutcome .GetFailed ().GetFailure (); failure != nil {
552+ return & activity.ActivityExecutionOutcome {
553+ Value : & activity.ActivityExecutionOutcome_Failure {Failure : failure },
554+ }
555+ }
556+ // Check for failure in last attempt details
557+ shouldHaveFailure := (a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_FAILED ||
558+ a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_TIMED_OUT ||
559+ a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_CANCELED ||
560+ a .GetStatus () == activitypb .ACTIVITY_EXECUTION_STATUS_TERMINATED )
561+ if shouldHaveFailure {
562+ if details := a .LastAttempt .Get (ctx ).GetLastFailureDetails (); details != nil {
563+ return & activity.ActivityExecutionOutcome {
564+ Value : & activity.ActivityExecutionOutcome_Failure {Failure : details .GetFailure ()},
565+ }
566+ }
567+ }
568+ return nil
569+ }
570+
571+ // StoreOrSelf returns the store for the activity. If the store is not set as a field (e.g.
572+ // standalone activities), it returns the activity itself.
573+ func (a * Activity ) StoreOrSelf (ctx chasm.Context ) ActivityStore {
566574 store , ok := a .Store .TryGet (ctx )
567575 if ok {
568576 return store
0 commit comments