From fb8894cfcc0a511b06146d291f673f715df3b51a Mon Sep 17 00:00:00 2001 From: Yaniv Kaul Date: Wed, 19 Aug 2026 07:16:25 +0300 Subject: [PATCH] perf: return TimerSequenceID by value instead of pointer (#11177) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Motivation `TimerSequenceID` (~48 bytes) is heap-allocated and returned as a `*TimerSequenceID` from 5 getter functions: `getUserTimerTimeout`, `getActivityScheduleToStartTimeout`, `getActivityScheduleToCloseTimeout`, `getActivityStartToCloseTimeout`, and `getActivityHeartbeatTimeout`. These are called for every pending timer/activity during `LoadAndSortUserTimers()` and `LoadAndSortActivityTimers()` — a hot path in every workflow task. Callers were already dereferencing the pointer before appending to the value-type `[]TimerSequenceID` slice, so the existing code was allocating on the heap only to immediately copy to the stack. ## Changes - `TimerSequenceID` is now returned by value with a `(TimerSequenceID, bool)` tuple - Idiomatic Go pattern (same as map access) replaces nil-check sentinel - All 5 getter methods updated + call sites and tests adapted ## Impact Eliminates one heap allocation per getter call on the timer-sorting hot path. ## Tests - `service/history/workflow` (1075 tests): ✅ passed --------- Co-authored-by: Prathyush PV --- service/history/workflow/timer_sequence.go | 103 +++++++------- .../history/workflow/timer_sequence_test.go | 130 ++++++++++-------- 2 files changed, 120 insertions(+), 113 deletions(-) diff --git a/service/history/workflow/timer_sequence.go b/service/history/workflow/timer_sequence.go index ea261ddccf..20c3be25e1 100644 --- a/service/history/workflow/timer_sequence.go +++ b/service/history/workflow/timer_sequence.go @@ -171,11 +171,7 @@ func (t *timerSequenceImpl) LoadAndSortUserTimers() []TimerSequenceID { for _, timerInfo := range pendingTimers { - if sequenceID := t.getUserTimerTimeout( - timerInfo, - ); sequenceID != nil { - timers = append(timers, *sequenceID) - } + timers = append(timers, t.getUserTimerTimeout(timerInfo)) } sort.Sort(timers) @@ -193,28 +189,28 @@ func (t *timerSequenceImpl) LoadAndSortActivityTimers() []TimerSequenceID { if activityInfo.Paused { continue } - if sequenceID := t.getActivityScheduleToCloseTimeout( + if sequenceID, ok := t.getActivityScheduleToCloseTimeout( activityInfo, - ); sequenceID != nil { - activityTimers = append(activityTimers, *sequenceID) + ); ok { + activityTimers = append(activityTimers, sequenceID) } - if sequenceID := t.getActivityScheduleToStartTimeout( + if sequenceID, ok := t.getActivityScheduleToStartTimeout( activityInfo, - ); sequenceID != nil { - activityTimers = append(activityTimers, *sequenceID) + ); ok { + activityTimers = append(activityTimers, sequenceID) } - if sequenceID := t.getActivityStartToCloseTimeout( + if sequenceID, ok := t.getActivityStartToCloseTimeout( activityInfo, - ); sequenceID != nil { - activityTimers = append(activityTimers, *sequenceID) + ); ok { + activityTimers = append(activityTimers, sequenceID) } - if sequenceID := t.getActivityHeartbeatTimeout( + if sequenceID, ok := t.getActivityHeartbeatTimeout( activityInfo, - ); sequenceID != nil { - activityTimers = append(activityTimers, *sequenceID) + ); ok { + activityTimers = append(activityTimers, sequenceID) } } @@ -224,11 +220,11 @@ func (t *timerSequenceImpl) LoadAndSortActivityTimers() []TimerSequenceID { func (t *timerSequenceImpl) getUserTimerTimeout( timerInfo *persistencespb.TimerInfo, -) *TimerSequenceID { +) TimerSequenceID { expiryTime := timerInfo.ExpiryTime - return &TimerSequenceID{ + return TimerSequenceID{ EventID: timerInfo.GetStartedEventId(), Timestamp: timestamp.TimeValue(expiryTime), TimerType: enumspb.TIMEOUT_TYPE_START_TO_CLOSE, @@ -256,14 +252,15 @@ type activityTimerDeadlines [4]*time.Time // definition of each deadline. func getActivityTimerDeadlines(activityInfo *persistencespb.ActivityInfo) activityTimerDeadlines { var deadlines activityTimerDeadlines - for i, sequenceID := range [4]*TimerSequenceID{ - getActivityScheduleToCloseTimeout(activityInfo), - getActivityScheduleToStartTimeout(activityInfo), - getActivityStartToCloseTimeout(activityInfo), - getActivityHeartbeatTimeout(activityInfo), + for i, getTimeout := range [4]func(*persistencespb.ActivityInfo) (TimerSequenceID, bool){ + getActivityScheduleToCloseTimeout, + getActivityScheduleToStartTimeout, + getActivityStartToCloseTimeout, + getActivityHeartbeatTimeout, } { - if sequenceID != nil { - deadlines[i] = &sequenceID.Timestamp + if sequenceID, ok := getTimeout(activityInfo); ok { + deadline := sequenceID.Timestamp + deadlines[i] = &deadline } } return deadlines @@ -291,58 +288,58 @@ func (d activityTimerDeadlines) changedMask(other activityTimerDeadlines) int32 func (t *timerSequenceImpl) getActivityScheduleToStartTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { return getActivityScheduleToStartTimeout(activityInfo) } func getActivityScheduleToStartTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { // activity is not scheduled yet, probably due to retry & backoff if activityInfo.ScheduledEventId == common.EmptyEventID { - return nil + return TimerSequenceID{}, false } // activity is already started if activityInfo.StartedEventId != common.EmptyEventID { - return nil + return TimerSequenceID{}, false } scheduleToStartDuration := timestamp.DurationValue(activityInfo.ScheduleToStartTimeout) if scheduleToStartDuration == 0 { - return nil + return TimerSequenceID{}, false } timeoutTime := timestamp.TimeValue(activityInfo.ScheduledTime).Add(scheduleToStartDuration) - return &TimerSequenceID{ + return TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: timeoutTime, TimerType: enumspb.TIMEOUT_TYPE_SCHEDULE_TO_START, TimerCreated: (activityInfo.TimerTaskStatus & TimerTaskStatusCreatedScheduleToStart) > 0, Attempt: activityInfo.Attempt, - } + }, true } func (t *timerSequenceImpl) getActivityScheduleToCloseTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { return getActivityScheduleToCloseTimeout(activityInfo) } func getActivityScheduleToCloseTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { // activity is not scheduled yet, probably due to retry & backoff if activityInfo.ScheduledEventId == common.EmptyEventID { - return nil + return TimerSequenceID{}, false } scheduleToCloseDuration := timestamp.DurationValue(activityInfo.ScheduleToCloseTimeout) if scheduleToCloseDuration == 0 { - return nil + return TimerSequenceID{}, false } var timeoutTime time.Time @@ -354,75 +351,75 @@ func getActivityScheduleToCloseTimeout( timeoutTime = timestamp.TimeValue(activityInfo.ScheduledTime).Add(scheduleToCloseDuration) } - return &TimerSequenceID{ + return TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: timeoutTime, TimerType: enumspb.TIMEOUT_TYPE_SCHEDULE_TO_CLOSE, TimerCreated: (activityInfo.TimerTaskStatus & TimerTaskStatusCreatedScheduleToClose) > 0, Attempt: activityInfo.Attempt, - } + }, true } func (t *timerSequenceImpl) getActivityStartToCloseTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { return getActivityStartToCloseTimeout(activityInfo) } func getActivityStartToCloseTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { // activity is not scheduled yet, probably due to retry & backoff if activityInfo.ScheduledEventId == common.EmptyEventID { - return nil + return TimerSequenceID{}, false } // activity is not started yet if activityInfo.StartedEventId == common.EmptyEventID { - return nil + return TimerSequenceID{}, false } startToCloseDuration := timestamp.DurationValue(activityInfo.StartToCloseTimeout) if startToCloseDuration == 0 { - return nil + return TimerSequenceID{}, false } timeoutTime := timestamp.TimeValue(activityInfo.StartedTime).Add(startToCloseDuration) - return &TimerSequenceID{ + return TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: timeoutTime, TimerType: enumspb.TIMEOUT_TYPE_START_TO_CLOSE, TimerCreated: (activityInfo.TimerTaskStatus & TimerTaskStatusCreatedStartToClose) > 0, Attempt: activityInfo.Attempt, - } + }, true } func (t *timerSequenceImpl) getActivityHeartbeatTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { return getActivityHeartbeatTimeout(activityInfo) } func getActivityHeartbeatTimeout( activityInfo *persistencespb.ActivityInfo, -) *TimerSequenceID { +) (TimerSequenceID, bool) { // activity is not scheduled yet, probably due to retry & backoff if activityInfo.ScheduledEventId == common.EmptyEventID { - return nil + return TimerSequenceID{}, false } // activity is not started yet if activityInfo.StartedEventId == common.EmptyEventID { - return nil + return TimerSequenceID{}, false } // not heartbeat timeout configured heartbeatDuration := timestamp.DurationValue(activityInfo.HeartbeatTimeout) if heartbeatDuration == 0 { - return nil + return TimerSequenceID{}, false } // use the latest time as last heartbeat time @@ -437,13 +434,13 @@ func getActivityHeartbeatTimeout( heartbeatTimeout := lastHeartbeat.Add(heartbeatDuration) - return &TimerSequenceID{ + return TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: heartbeatTimeout, TimerType: enumspb.TIMEOUT_TYPE_HEARTBEAT, TimerCreated: (activityInfo.TimerTaskStatus & TimerTaskStatusCreatedHeartbeat) > 0, Attempt: activityInfo.Attempt, - } + }, true } func timerTypeToTimerMask( diff --git a/service/history/workflow/timer_sequence_test.go b/service/history/workflow/timer_sequence_test.go index 9a90b1ea3a..ebf0da8b2b 100644 --- a/service/history/workflow/timer_sequence_test.go +++ b/service/history/workflow/timer_sequence_test.go @@ -927,7 +927,7 @@ func (s *timerSequenceSuite) TestGetUserTimerTimeout() { TaskStatus: TimerTaskStatusCreated, } - expectedTimerSequence := &TimerSequenceID{ + expectedTimerSequence := TimerSequenceID{ EventID: timerInfo.StartedEventId, Timestamp: timerExpiry.AsTime(), TimerType: enumspb.TIMEOUT_TYPE_START_TO_CLOSE, @@ -962,8 +962,8 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithTimeout_N Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithTimeout_Scheduled_NotStarted() { @@ -984,7 +984,7 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithTimeout_S Attempt: 12, } - expectedTimerSequence := &TimerSequenceID{ + expectedTimerSequence := TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: activityInfo.ScheduledTime.AsTime().Add(activityInfo.ScheduleToStartTimeout.AsDuration()), TimerType: enumspb.TIMEOUT_TYPE_SCHEDULE_TO_START, @@ -992,12 +992,14 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithTimeout_S Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + timerSequence, ok := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) activityInfo.TimerTaskStatus = TimerTaskStatusNone expectedTimerSequence.TimerCreated = false - timerSequence = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + timerSequence, ok = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) } @@ -1019,12 +1021,12 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithTimeout_S Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) activityInfo.TimerTaskStatus = TimerTaskStatusNone - timerSequence = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithoutTimeout_NotScheduled() { @@ -1045,8 +1047,8 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithoutTimeou Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithoutTimeout_Scheduled_NotStarted() { @@ -1067,12 +1069,12 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithoutTimeou Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) activityInfo.TimerTaskStatus = TimerTaskStatusNone - timerSequence = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithoutTimeout_Scheduled_Started() { @@ -1093,12 +1095,12 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToStartTimeout_WithoutTimeou Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) activityInfo.TimerTaskStatus = TimerTaskStatusNone - timerSequence = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) - s.Empty(timerSequence) + _, ok = s.timerSequence.getActivityScheduleToStartTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithTimeout_NotScheduled() { @@ -1119,8 +1121,8 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithTimeout_N Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithTimeout_Scheduled() { @@ -1142,7 +1144,7 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithTimeout_S Attempt: 12, } - expectedTimerSequence := &TimerSequenceID{ + expectedTimerSequence := TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: activityInfo.ScheduledTime.AsTime().Add(activityInfo.ScheduleToCloseTimeout.AsDuration()), TimerType: enumspb.TIMEOUT_TYPE_SCHEDULE_TO_CLOSE, @@ -1150,12 +1152,14 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithTimeout_S Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + timerSequence, ok := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) activityInfo.TimerTaskStatus = TimerTaskStatusNone expectedTimerSequence.TimerCreated = false - timerSequence = s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + timerSequence, ok = s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) } @@ -1177,8 +1181,8 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithoutTimeou Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithoutTimeout_Scheduled() { @@ -1199,12 +1203,12 @@ func (s *timerSequenceSuite) TestGetActivityScheduleToCloseTimeout_WithoutTimeou Attempt: 12, } - timerSequence := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + s.False(ok) activityInfo.TimerTaskStatus = TimerTaskStatusNone - timerSequence = s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok = s.timerSequence.getActivityScheduleToCloseTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithTimeout_NotStarted() { @@ -1225,8 +1229,8 @@ func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithTimeout_NotS Attempt: 12, } - timerSequence := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithTimeout_Started() { @@ -1247,7 +1251,7 @@ func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithTimeout_Star Attempt: 12, } - expectedTimerSequence := &TimerSequenceID{ + expectedTimerSequence := TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: activityInfo.StartedTime.AsTime().Add(activityInfo.StartToCloseTimeout.AsDuration()), TimerType: enumspb.TIMEOUT_TYPE_START_TO_CLOSE, @@ -1255,12 +1259,14 @@ func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithTimeout_Star Attempt: 12, } - timerSequence := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + timerSequence, ok := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) activityInfo.TimerTaskStatus = TimerTaskStatusNone expectedTimerSequence.TimerCreated = false - timerSequence = s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + timerSequence, ok = s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) } @@ -1282,8 +1288,8 @@ func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithoutTimeout_N Attempt: 12, } - timerSequence := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithoutTimeout_Started() { @@ -1304,12 +1310,12 @@ func (s *timerSequenceSuite) TestGetActivityStartToCloseTimeout_WithoutTimeout_S Attempt: 12, } - timerSequence := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + s.False(ok) activityInfo.TimerTaskStatus = TimerTaskStatusNone - timerSequence = s.timerSequence.getActivityStartToCloseTimeout(activityInfo) - s.Empty(timerSequence) + _, ok = s.timerSequence.getActivityStartToCloseTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithHeartbeat_NotStarted() { @@ -1330,8 +1336,8 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithHeartbeat_NotSt Attempt: 12, } - timerSequence := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithHeartbeat_Started_NoHeartbeat() { @@ -1352,7 +1358,7 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithHeartbeat_Start Attempt: 12, } - expectedTimerSequence := &TimerSequenceID{ + expectedTimerSequence := TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: activityInfo.StartedTime.AsTime().Add(activityInfo.HeartbeatTimeout.AsDuration()), TimerType: enumspb.TIMEOUT_TYPE_HEARTBEAT, @@ -1360,12 +1366,14 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithHeartbeat_Start Attempt: 12, } - timerSequence := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + timerSequence, ok := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) activityInfo.TimerTaskStatus = TimerTaskStatusNone expectedTimerSequence.TimerCreated = false - timerSequence = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + timerSequence, ok = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) } @@ -1387,7 +1395,7 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithHeartbeat_Start Attempt: 12, } - expectedTimerSequence := &TimerSequenceID{ + expectedTimerSequence := TimerSequenceID{ EventID: activityInfo.ScheduledEventId, Timestamp: activityInfo.LastHeartbeatUpdateTime.AsTime().Add(activityInfo.HeartbeatTimeout.AsDuration()), TimerType: enumspb.TIMEOUT_TYPE_HEARTBEAT, @@ -1395,12 +1403,14 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithHeartbeat_Start Attempt: 12, } - timerSequence := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + timerSequence, ok := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) activityInfo.TimerTaskStatus = TimerTaskStatusNone expectedTimerSequence.TimerCreated = false - timerSequence = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + timerSequence, ok = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.True(ok) s.Equal(expectedTimerSequence, timerSequence) } @@ -1422,8 +1432,8 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithoutHeartbeat_No Attempt: 12, } - timerSequence := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithoutHeartbeat_Started_NoHeartbeat() { @@ -1444,12 +1454,12 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithoutHeartbeat_St Attempt: 12, } - timerSequence := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.False(ok) activityInfo.TimerTaskStatus = TimerTaskStatusNone - timerSequence = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) - s.Empty(timerSequence) + _, ok = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithoutHeartbeat_Started_Heartbeated() { @@ -1470,12 +1480,12 @@ func (s *timerSequenceSuite) TestGetActivityHeartbeatTimeout_WithoutHeartbeat_St Attempt: 12, } - timerSequence := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) - s.Empty(timerSequence) + _, ok := s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.False(ok) activityInfo.TimerTaskStatus = TimerTaskStatusNone - timerSequence = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) - s.Empty(timerSequence) + _, ok = s.timerSequence.getActivityHeartbeatTimeout(activityInfo) + s.False(ok) } func (s *timerSequenceSuite) TestConversion() {