Skip to content

Commit d122f6d

Browse files
Jenny BuckleyAntoine Pelisse
authored andcommitted
Cache Comparison result rather than versioned objects
We currently cache the versioned objects, which we use to then run the comparison, but we don't need to cache the versioned object if we cache the result of the comparison. This avoid a lot of extra comparisons.
1 parent 15d366b commit d122f6d

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

merge/update.go

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,45 +36,43 @@ type Updater struct {
3636
func (s *Updater) update(oldObject, newObject *typed.TypedValue, version fieldpath.APIVersion, managers fieldpath.ManagedFields, workflow string, force bool) (fieldpath.ManagedFields, error) {
3737
conflicts := fieldpath.ManagedFields{}
3838
removed := fieldpath.ManagedFields{}
39-
type Versioned struct {
40-
oldObject *typed.TypedValue
41-
newObject *typed.TypedValue
39+
compare, err := oldObject.Compare(newObject)
40+
if err != nil {
41+
return nil, fmt.Errorf("failed to compare objects: %v", err)
4242
}
43-
versions := map[fieldpath.APIVersion]Versioned{
44-
version: {
45-
oldObject: oldObject,
46-
newObject: newObject,
47-
},
43+
44+
versions := map[fieldpath.APIVersion]*typed.Comparison{
45+
version: compare,
4846
}
4947

5048
for manager, managerSet := range managers {
5149
if manager == workflow {
5250
continue
5351
}
54-
versioned, ok := versions[managerSet.APIVersion]
52+
compare, ok := versions[managerSet.APIVersion]
5553
if !ok {
5654
var err error
57-
versioned.oldObject, err = s.Converter.Convert(oldObject, managerSet.APIVersion)
55+
versionedOldObject, err := s.Converter.Convert(oldObject, managerSet.APIVersion)
5856
if err != nil {
5957
if s.Converter.IsMissingVersionError(err) {
6058
delete(managers, manager)
6159
continue
6260
}
6361
return nil, fmt.Errorf("failed to convert old object: %v", err)
6462
}
65-
versioned.newObject, err = s.Converter.Convert(newObject, managerSet.APIVersion)
63+
versionedNewObject, err := s.Converter.Convert(newObject, managerSet.APIVersion)
6664
if err != nil {
6765
if s.Converter.IsMissingVersionError(err) {
6866
delete(managers, manager)
6967
continue
7068
}
7169
return nil, fmt.Errorf("failed to convert new object: %v", err)
7270
}
73-
versions[managerSet.APIVersion] = versioned
74-
}
75-
compare, err := versioned.oldObject.Compare(versioned.newObject)
76-
if err != nil {
77-
return nil, fmt.Errorf("failed to compare objects: %v", err)
71+
compare, err = versionedOldObject.Compare(versionedNewObject)
72+
if err != nil {
73+
return nil, fmt.Errorf("failed to compare objects: %v", err)
74+
}
75+
versions[managerSet.APIVersion] = compare
7876
}
7977

8078
conflictSet := managerSet.Intersection(compare.Modified.Union(compare.Added))

0 commit comments

Comments
 (0)