Skip to content

Commit e16f427

Browse files
FFM-11653 Sort Flag/Group rules when saving to cache (#162)
* Bump github.com/hashicorp/go-retryablehttp from 0.7.4 to 0.7.7 Bumps [github.com/hashicorp/go-retryablehttp](https://github.com/hashicorp/go-retryablehttp) from 0.7.4 to 0.7.7. - [Changelog](https://github.com/hashicorp/go-retryablehttp/blob/main/CHANGELOG.md) - [Commits](hashicorp/go-retryablehttp@v0.7.4...v0.7.7) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-retryablehttp dependency-type: direct:production ... Signed-off-by: dependabot[bot] <[email protected]> * FFM-11653 Sort v2 serving rules when storing segment * FFM-11653 Sort flag rules when storing flag * FFM-11653 Fix typo * FFM-11194 Fix test * FFM-11194 Bump sdk version --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1 parent 4e63499 commit e16f427

File tree

6 files changed

+52
-18
lines changed

6 files changed

+52
-18
lines changed

Diff for: analyticsservice/analytics.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const (
2626
variationValueAttribute string = "featureValue"
2727
targetAttribute string = "target"
2828
sdkVersionAttribute string = "SDK_VERSION"
29-
SdkVersion string = "0.1.23"
29+
SdkVersion string = "0.1.24"
3030
sdkTypeAttribute string = "SDK_TYPE"
3131
sdkType string = "server"
3232
sdkLanguageAttribute string = "SDK_LANGUAGE"

Diff for: evaluation/evaluator.go

-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"errors"
66
"fmt"
77
"regexp"
8-
"sort"
98
"strconv"
109
"strings"
1110

@@ -145,9 +144,6 @@ func (e Evaluator) evaluateRules(servingRules []rest.ServingRule, target *Target
145144
return ""
146145
}
147146

148-
sort.SliceStable(servingRules, func(i, j int) bool {
149-
return servingRules[i].Priority < servingRules[j].Priority
150-
})
151147
for i := range servingRules {
152148
rule := servingRules[i]
153149
if len(rule.Clauses) == 0 {
@@ -279,9 +275,6 @@ func (e Evaluator) isTargetIncludedOrExcludedInSegment(segmentList []string, tar
279275
// `ServingRules` replaces `Rules, so if sent by the backend then we evaluate them instead
280276
if segment.ServingRules != nil && len(*segment.ServingRules) > 0 {
281277
v2Rules := *segment.ServingRules
282-
sort.SliceStable(v2Rules, func(i, j int) bool {
283-
return v2Rules[i].Priority < v2Rules[j].Priority
284-
})
285278
for _, v2rule := range v2Rules {
286279
if e.evaluateGroupRulesV2(v2rule.Clauses, target) {
287280
e.logger.Debugf(

Diff for: evaluation/evaluator_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -832,7 +832,7 @@ func TestEvaluator_evaluateRules(t *testing.T) {
832832
// priority is on second one and should return true
833833
servingRules: []rest.ServingRule{
834834
{
835-
Priority: 2,
835+
Priority: 1,
836836
Clauses: []rest.Clause{
837837
{
838838
Attribute: identifier,
@@ -841,11 +841,11 @@ func TestEvaluator_evaluateRules(t *testing.T) {
841841
},
842842
},
843843
Serve: rest.Serve{
844-
Variation: &identifierFalse,
844+
Variation: &identifierTrue,
845845
},
846846
},
847847
{
848-
Priority: 1,
848+
Priority: 2,
849849
Clauses: []rest.Clause{
850850
{
851851
Attribute: identifier,
@@ -854,7 +854,7 @@ func TestEvaluator_evaluateRules(t *testing.T) {
854854
},
855855
},
856856
Serve: rest.Serve{
857-
Variation: &identifierTrue,
857+
Variation: &identifierFalse,
858858
},
859859
},
860860
},

Diff for: go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/golang-jwt/jwt v3.2.2+incompatible
1010
github.com/google/uuid v1.5.0
1111
github.com/harness-community/sse/v3 v3.1.0
12-
github.com/hashicorp/go-retryablehttp v0.7.4
12+
github.com/hashicorp/go-retryablehttp v0.7.7
1313
github.com/hashicorp/golang-lru v0.5.4
1414
github.com/jarcoal/httpmock v1.0.8
1515
github.com/json-iterator/go v1.1.12

Diff for: go.sum

+6-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
1111
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1212
github.com/deepmap/oapi-codegen/v2 v2.1.0 h1:I/NMVhJCtuvL9x+S2QzZKpSjGi33oDZwPRdemvOZWyQ=
1313
github.com/deepmap/oapi-codegen/v2 v2.1.0/go.mod h1:R1wL226vc5VmCNJUvMyYr3hJMm5reyv25j952zAVXZ8=
14+
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
1415
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
1516
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
1617
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
@@ -28,10 +29,9 @@ github.com/harness-community/sse/v3 v3.1.0 h1:uaLxXzC9DjpWEV/qTYU3uJV3eLMTRhMY2P
2829
github.com/harness-community/sse/v3 v3.1.0/go.mod h1:v4ft76Eaj+kAsUcc29zIspInWgpzsMLlHLb4x/PYVX0=
2930
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
3031
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
31-
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
32-
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
33-
github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA=
34-
github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8=
32+
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
33+
github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
34+
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
3535
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
3636
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
3737
github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY=
@@ -51,6 +51,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
5151
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
5252
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
5353
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
54+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
55+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
5456
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
5557
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
5658
github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
@@ -76,7 +78,6 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b
7678
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
7779
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
7880
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
79-
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
8081
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
8182
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
8283
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=

Diff for: pkg/repository/repository.go

+40
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package repository
22

33
import (
44
"fmt"
5+
"sort"
56

67
"golang.org/x/exp/slices"
78

@@ -156,6 +157,9 @@ func (r FFRepository) SetFlag(featureConfig rest.FeatureConfig, initialLoad bool
156157
return
157158
}
158159
}
160+
161+
SortFeatureConfigServingRules(&featureConfig)
162+
159163
flagKey := formatFlagKey(featureConfig.Feature)
160164
if r.storage != nil {
161165
if err := r.storage.Set(flagKey, featureConfig); err != nil {
@@ -180,6 +184,10 @@ func (r FFRepository) SetFlags(initialLoad bool, envID string, featureConfigs ..
180184
}
181185
}
182186

187+
for i := range featureConfigs {
188+
SortFeatureConfigServingRules(&featureConfigs[i])
189+
}
190+
183191
key := formatFlagsKey(envID)
184192

185193
if r.storage != nil {
@@ -204,6 +212,7 @@ func (r FFRepository) SetSegment(segment rest.Segment, initialLoad bool) {
204212
return
205213
}
206214
}
215+
SortSegmentServingGroups(&segment)
207216
segmentKey := formatSegmentKey(segment.Identifier)
208217
if r.storage != nil {
209218
if err := r.storage.Set(segmentKey, segment); err != nil {
@@ -228,6 +237,11 @@ func (r FFRepository) SetSegments(initialLoad bool, envID string, segments ...re
228237
}
229238
}
230239

240+
// Sort the serving rules of each segment before storing them
241+
for i := range segments {
242+
SortSegmentServingGroups(&segments[i])
243+
}
244+
231245
key := formatSegmentsKey(envID)
232246

233247
if r.storage != nil {
@@ -447,6 +461,32 @@ func (r FFRepository) areSegmentsOutdated(envID string, segments ...rest.Segment
447461
return false
448462
}
449463

464+
// SortFeatureConfigServingRules sorts the serving rules of a FeatureConfig by priority
465+
func SortFeatureConfigServingRules(featureConfig *rest.FeatureConfig) {
466+
if featureConfig == nil || featureConfig.Rules == nil || len(*featureConfig.Rules) <= 1 {
467+
return
468+
}
469+
470+
rules := *featureConfig.Rules
471+
472+
sort.SliceStable(rules, func(i, j int) bool {
473+
return rules[i].Priority < rules[j].Priority
474+
})
475+
}
476+
477+
// SortSegmentServingGroups sorts the serving rules of a segment by priority
478+
func SortSegmentServingGroups(segment *rest.Segment) {
479+
if segment == nil || segment.ServingRules == nil || len(*segment.ServingRules) <= 1 {
480+
return
481+
}
482+
483+
v2Rules := *segment.ServingRules
484+
485+
sort.SliceStable(v2Rules, func(i, j int) bool {
486+
return v2Rules[i].Priority < v2Rules[j].Priority
487+
})
488+
}
489+
450490
// Close all resources
451491
func (r FFRepository) Close() {
452492

0 commit comments

Comments
 (0)