perf: return TimerSequenceID by value instead of pointer (#11177)

## 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 <prathyush.pv@temporal.io>
This commit is contained in:
Yaniv Kaul
2026-08-19 07:16:25 +03:00
committed by GitHub
parent 732f7b412c
commit fb8894cfcc
2 changed files with 120 additions and 113 deletions

View File

@@ -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(

View File

@@ -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() {