Skip to content

Commit 36e40fb

Browse files
authored
Merge pull request kubernetes#87044 from jennybuckley/smd-prob
Enable tracking field management for some objects before they are applied to
2 parents 4a55a55 + 4db3822 commit 36e40fb

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ import (
3333
// TODO(jennybuckley): Determine if this is really the best value. Ideally we wouldn't unnecessarily merge too many entries.
3434
const DefaultMaxUpdateManagers int = 10
3535

36+
// DefaultTrackOnCreateProbability defines the default probability that the field management of an object
37+
// starts being tracked from the object's creation, instead of from the first time the object is applied to.
38+
const DefaultTrackOnCreateProbability float32 = 0.5
39+
3640
// Managed groups a fieldpath.ManagedFields together with the timestamps associated with each operation.
3741
type Managed interface {
3842
// Fields gets the fieldpath.ManagedFields.
@@ -92,7 +96,7 @@ func newDefaultFieldManager(f Manager, objectCreater runtime.ObjectCreater, kind
9296
f = NewStripMetaManager(f)
9397
f = NewBuildManagerInfoManager(f, kind.GroupVersion())
9498
f = NewCapManagersManager(f, DefaultMaxUpdateManagers)
95-
f = NewSkipNonAppliedManager(f, objectCreater, kind)
99+
f = NewProbabilisticSkipNonAppliedManager(f, objectCreater, kind, DefaultTrackOnCreateProbability)
96100
return NewFieldManager(f)
97101
}
98102

staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/skipnonapplied.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ package fieldmanager
1818

1919
import (
2020
"fmt"
21+
"math/rand"
2122

23+
"k8s.io/apimachinery/pkg/api/meta"
2224
"k8s.io/apimachinery/pkg/runtime"
2325
"k8s.io/apimachinery/pkg/runtime/schema"
2426
)
@@ -28,25 +30,48 @@ type skipNonAppliedManager struct {
2830
objectCreater runtime.ObjectCreater
2931
gvk schema.GroupVersionKind
3032
beforeApplyManagerName string
33+
probability float32
3134
}
3235

3336
var _ Manager = &skipNonAppliedManager{}
3437

3538
// NewSkipNonAppliedManager creates a new wrapped FieldManager that only starts tracking managers after the first apply.
3639
func NewSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater, gvk schema.GroupVersionKind) Manager {
40+
return NewProbabilisticSkipNonAppliedManager(fieldManager, objectCreater, gvk, 0.0)
41+
}
42+
43+
// NewProbabilisticSkipNonAppliedManager creates a new wrapped FieldManager that starts tracking managers after the first apply,
44+
// or starts tracking on create with p probability.
45+
func NewProbabilisticSkipNonAppliedManager(fieldManager Manager, objectCreater runtime.ObjectCreater, gvk schema.GroupVersionKind, p float32) Manager {
3746
return &skipNonAppliedManager{
3847
fieldManager: fieldManager,
3948
objectCreater: objectCreater,
4049
gvk: gvk,
4150
beforeApplyManagerName: "before-first-apply",
51+
probability: p,
4252
}
4353
}
4454

4555
// Update implements Manager.
4656
func (f *skipNonAppliedManager) Update(liveObj, newObj runtime.Object, managed Managed, manager string) (runtime.Object, Managed, error) {
47-
if len(managed.Fields()) == 0 {
57+
accessor, err := meta.Accessor(liveObj)
58+
if err != nil {
4859
return newObj, managed, nil
4960
}
61+
62+
// If managed fields is empty, we need to determine whether to skip tracking managed fields.
63+
if len(managed.Fields()) == 0 {
64+
// Check if the operation is a create, by checking whether lastObj's UID is empty.
65+
// If the operation is create, P(tracking managed fields) = f.probability
66+
// If the operation is update, skip tracking managed fields, since we already know managed fields is empty.
67+
if len(accessor.GetUID()) == 0 {
68+
if f.probability <= rand.Float32() {
69+
return newObj, managed, nil
70+
}
71+
} else {
72+
return newObj, managed, nil
73+
}
74+
}
5075
return f.fieldManager.Update(liveObj, newObj, managed, manager)
5176
}
5277

0 commit comments

Comments
 (0)