Skip to content

Commit 1f880f6

Browse files
authored
Adds override for individual fields on activity retry policy #628
1 parent 02c8fac commit 1f880f6

File tree

4 files changed

+145
-1
lines changed

4 files changed

+145
-1
lines changed

common/util.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,38 @@ func SortInt64Slice(slice []int64) {
367367
})
368368
}
369369

370+
// EnsureRetryPolicyDefaults ensures the policy subfields, if not explicitly set, are set to the specified defaults
371+
func EnsureRetryPolicyDefaults(originalPolicy *commonpb.RetryPolicy, defaultPolicy *commonpb.RetryPolicy) *commonpb.RetryPolicy {
372+
if originalPolicy == nil {
373+
return defaultPolicy
374+
}
375+
376+
merged := &commonpb.RetryPolicy{
377+
BackoffCoefficient: originalPolicy.GetBackoffCoefficient(),
378+
InitialIntervalInSeconds: originalPolicy.GetInitialIntervalInSeconds(),
379+
MaximumIntervalInSeconds: originalPolicy.GetMaximumIntervalInSeconds(),
380+
MaximumAttempts: originalPolicy.GetMaximumAttempts(),
381+
}
382+
383+
if merged.GetMaximumAttempts() == 0 {
384+
merged.MaximumAttempts = defaultPolicy.GetMaximumAttempts()
385+
}
386+
387+
if merged.GetInitialIntervalInSeconds() == 0 {
388+
merged.InitialIntervalInSeconds = defaultPolicy.GetInitialIntervalInSeconds()
389+
}
390+
391+
if merged.GetMaximumIntervalInSeconds() == 0 {
392+
merged.MaximumIntervalInSeconds = defaultPolicy.GetMaximumIntervalInSeconds()
393+
}
394+
395+
if merged.GetBackoffCoefficient() == 0 {
396+
merged.BackoffCoefficient = defaultPolicy.GetBackoffCoefficient()
397+
}
398+
399+
return merged
400+
}
401+
370402
// ValidateRetryPolicy validates a retry policy
371403
func ValidateRetryPolicy(policy *commonpb.RetryPolicy) error {
372404
if policy == nil {

common/util_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,84 @@ func TestValidateRetryPolicy(t *testing.T) {
8787
})
8888
}
8989
}
90+
91+
func TestEnsureRetryPolicyDefaults(t *testing.T) {
92+
defaultRetryPolicy := &commonpb.RetryPolicy{
93+
InitialIntervalInSeconds: 1,
94+
MaximumIntervalInSeconds: 100,
95+
BackoffCoefficient: 2,
96+
MaximumAttempts: 120,
97+
}
98+
99+
testCases := []struct {
100+
name string
101+
input *commonpb.RetryPolicy
102+
want *commonpb.RetryPolicy
103+
}{
104+
{
105+
name: "nil policy is okay",
106+
input: nil,
107+
want: defaultRetryPolicy,
108+
},
109+
{
110+
name: "default fields are set ",
111+
input: &commonpb.RetryPolicy{},
112+
want: defaultRetryPolicy,
113+
},
114+
{
115+
name: "non-default InitialIntervalInSeconds is not set",
116+
input: &commonpb.RetryPolicy{
117+
InitialIntervalInSeconds: 2,
118+
},
119+
want: &commonpb.RetryPolicy{
120+
InitialIntervalInSeconds: 2,
121+
MaximumIntervalInSeconds: 100,
122+
BackoffCoefficient: 2,
123+
MaximumAttempts: 120,
124+
},
125+
},
126+
{
127+
name: "non-default MaximumIntervalInSeconds is not set",
128+
input: &commonpb.RetryPolicy{
129+
MaximumIntervalInSeconds: 1000,
130+
},
131+
want: &commonpb.RetryPolicy{
132+
InitialIntervalInSeconds: 1,
133+
MaximumIntervalInSeconds: 1000,
134+
BackoffCoefficient: 2,
135+
MaximumAttempts: 120,
136+
},
137+
},
138+
{
139+
name: "non-default BackoffCoefficient is not set",
140+
input: &commonpb.RetryPolicy{
141+
BackoffCoefficient: 1.5,
142+
},
143+
want: &commonpb.RetryPolicy{
144+
InitialIntervalInSeconds: 1,
145+
MaximumIntervalInSeconds: 100,
146+
BackoffCoefficient: 1.5,
147+
MaximumAttempts: 120,
148+
},
149+
},
150+
{
151+
name: "non-default Maximum attempts is not set",
152+
input: &commonpb.RetryPolicy{
153+
MaximumAttempts: 49,
154+
},
155+
want: &commonpb.RetryPolicy{
156+
InitialIntervalInSeconds: 1,
157+
MaximumIntervalInSeconds: 100,
158+
BackoffCoefficient: 2,
159+
MaximumAttempts: 49,
160+
},
161+
},
162+
}
163+
164+
for _, tt := range testCases {
165+
t.Run(tt.name, func(t *testing.T) {
166+
got := EnsureRetryPolicyDefaults(tt.input, defaultRetryPolicy)
167+
assert.Equal(t, tt.want, got)
168+
})
169+
}
170+
}

service/history/commandChecker.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,7 @@ func (v *commandAttrValidator) validateActivityRetryPolicy(attributes *commandpb
657657
return nil
658658
}
659659

660+
attributes.RetryPolicy = common.EnsureRetryPolicyDefaults(attributes.RetryPolicy, v.defaultActivityRetryPolicy)
660661
return common.ValidateRetryPolicy(attributes.RetryPolicy)
661662
}
662663

service/history/commandChecker_test.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ func (s *commandAttrValidatorSuite) TestValidateActivityRetryPolicy() {
572572
},
573573
},
574574
{
575-
name: "do not override set policy",
575+
name: "do not override fully set policy",
576576
input: &commonpb.RetryPolicy{
577577
InitialIntervalInSeconds: 5,
578578
BackoffCoefficient: 10,
@@ -586,6 +586,36 @@ func (s *commandAttrValidatorSuite) TestValidateActivityRetryPolicy() {
586586
MaximumAttempts: 8,
587587
},
588588
},
589+
{
590+
name: "partial override set policy",
591+
input: &commonpb.RetryPolicy{
592+
InitialIntervalInSeconds: 0,
593+
BackoffCoefficient: 1.2,
594+
MaximumIntervalInSeconds: 0,
595+
MaximumAttempts: 7,
596+
},
597+
want: &commonpb.RetryPolicy{
598+
InitialIntervalInSeconds: 1,
599+
BackoffCoefficient: 1.2,
600+
MaximumIntervalInSeconds: 100,
601+
MaximumAttempts: 7,
602+
},
603+
},
604+
{
605+
name: "override all defaults",
606+
input: &commonpb.RetryPolicy{
607+
InitialIntervalInSeconds: 0,
608+
BackoffCoefficient: 0,
609+
MaximumIntervalInSeconds: 0,
610+
MaximumAttempts: 0,
611+
},
612+
want: &commonpb.RetryPolicy{
613+
InitialIntervalInSeconds: 1,
614+
BackoffCoefficient: 2,
615+
MaximumIntervalInSeconds: 100,
616+
MaximumAttempts: 0,
617+
},
618+
},
589619
}
590620

591621
for _, tt := range testCases {

0 commit comments

Comments
 (0)