@@ -18,7 +18,9 @@ package fieldmanager
18
18
19
19
import (
20
20
"fmt"
21
+ "math/rand"
21
22
23
+ "k8s.io/apimachinery/pkg/api/meta"
22
24
"k8s.io/apimachinery/pkg/runtime"
23
25
"k8s.io/apimachinery/pkg/runtime/schema"
24
26
)
@@ -28,25 +30,48 @@ type skipNonAppliedManager struct {
28
30
objectCreater runtime.ObjectCreater
29
31
gvk schema.GroupVersionKind
30
32
beforeApplyManagerName string
33
+ probability float32
31
34
}
32
35
33
36
var _ Manager = & skipNonAppliedManager {}
34
37
35
38
// NewSkipNonAppliedManager creates a new wrapped FieldManager that only starts tracking managers after the first apply.
36
39
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 {
37
46
return & skipNonAppliedManager {
38
47
fieldManager : fieldManager ,
39
48
objectCreater : objectCreater ,
40
49
gvk : gvk ,
41
50
beforeApplyManagerName : "before-first-apply" ,
51
+ probability : p ,
42
52
}
43
53
}
44
54
45
55
// Update implements Manager.
46
56
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 {
48
59
return newObj , managed , nil
49
60
}
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
+ }
50
75
return f .fieldManager .Update (liveObj , newObj , managed , manager )
51
76
}
52
77
0 commit comments