Skip to content

Commit cc75a1b

Browse files
reduce unnecessary watch events in the work-status-controller
Signed-off-by: changzhen <[email protected]>
1 parent 070927d commit cc75a1b

File tree

5 files changed

+494
-15
lines changed

5 files changed

+494
-15
lines changed

cmd/agent/app/agent.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ func startWorkStatusController(ctx controllerscontext.Context) (bool, error) {
366366
InformerManager: genericmanager.GetInstance(),
367367
Context: ctx.Context,
368368
ObjectWatcher: ctx.ObjectWatcher,
369+
WorkPredicateFunc: helper.NewWorkStatusPredicateOnAgent(ctx.Opts.ClusterName),
369370
ClusterDynamicClientSetFunc: util.NewClusterDynamicClientSetForAgent,
370371
ClusterCacheSyncTimeout: ctx.Opts.ClusterCacheSyncTimeout,
371372
ConcurrentWorkStatusSyncs: ctx.Opts.ConcurrentWorkSyncs,

cmd/controller-manager/app/controllermanager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ func startWorkStatusController(ctx controllerscontext.Context) (enabled bool, er
475475
InformerManager: genericmanager.GetInstance(),
476476
Context: ctx.Context,
477477
ObjectWatcher: ctx.ObjectWatcher,
478-
WorkPredicateFunc: helper.WorkWithinPushClusterPredicate(ctx.Mgr),
478+
WorkPredicateFunc: helper.NewWorkStatusPredicate(ctx.Mgr),
479479
ClusterDynamicClientSetFunc: util.NewClusterDynamicClientSet,
480480
ClusterClientOption: ctx.ClusterClientOption,
481481
ClusterCacheSyncTimeout: opts.ClusterCacheSyncTimeout,

pkg/controllers/status/work_status_controller.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -543,18 +543,13 @@ func (c *WorkStatusController) getSingleClusterManager(cluster *clusterv1alpha1.
543543

544544
// SetupWithManager creates a controller and register to controller manager.
545545
func (c *WorkStatusController) SetupWithManager(mgr controllerruntime.Manager) error {
546-
ctrlBuilder := controllerruntime.NewControllerManagedBy(mgr).Named(WorkStatusControllerName).
546+
return controllerruntime.NewControllerManagedBy(mgr).
547+
Named(WorkStatusControllerName).
548+
For(&workv1alpha1.Work{}, builder.WithPredicates(c.WorkPredicateFunc)).
547549
WithOptions(controller.Options{
548550
RateLimiter: ratelimiterflag.DefaultControllerRateLimiter[controllerruntime.Request](c.RateLimiterOptions),
549-
})
550-
551-
if c.WorkPredicateFunc != nil {
552-
ctrlBuilder.For(&workv1alpha1.Work{}, builder.WithPredicates(c.WorkPredicateFunc))
553-
} else {
554-
ctrlBuilder.For(&workv1alpha1.Work{})
555-
}
556-
557-
return ctrlBuilder.Complete(c)
551+
}).
552+
Complete(c)
558553
}
559554

560555
func (c *WorkStatusController) eventf(object *unstructured.Unstructured, eventType, reason, messageFmt string, args ...interface{}) {

pkg/util/helper/predicate.go

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ import (
2929
"github.com/karmada-io/karmada/pkg/util/names"
3030
)
3131

32-
// WorkWithinPushClusterPredicate generates the event filter function to skip events that the controllers are uninterested.
33-
// Used by controllers:
34-
// - execution controller working in karmada-controller-manager
35-
// - work status controller working in karmada-controller-manager
32+
// WorkWithinPushClusterPredicate generates the event filter function for execution-controller in karmada-controller-manager
3633
func WorkWithinPushClusterPredicate(mgr controllerruntime.Manager) predicate.Funcs {
3734
predFunc := func(object client.Object) bool {
3835
obj := object.(*workv1alpha1.Work)
@@ -68,6 +65,65 @@ func WorkWithinPushClusterPredicate(mgr controllerruntime.Manager) predicate.Fun
6865
}
6966
}
7067

68+
func newWorkStatusPredicate(predFunc func(object client.Object) bool) predicate.Funcs {
69+
return predicate.Funcs{
70+
CreateFunc: func(createEvent event.CreateEvent) bool {
71+
return predFunc(createEvent.Object)
72+
},
73+
UpdateFunc: func(updateEvent event.UpdateEvent) bool {
74+
workOld := updateEvent.ObjectOld.(*workv1alpha1.Work)
75+
workNew := updateEvent.ObjectNew.(*workv1alpha1.Work)
76+
workOldApplied := IsResourceApplied(&workOld.Status)
77+
workNewApplied := IsResourceApplied(&workNew.Status)
78+
if !workOldApplied && workNewApplied {
79+
return predFunc(updateEvent.ObjectNew)
80+
}
81+
return false
82+
},
83+
DeleteFunc: func(event.DeleteEvent) bool {
84+
return false
85+
},
86+
GenericFunc: func(event.GenericEvent) bool {
87+
return false
88+
},
89+
}
90+
}
91+
92+
// NewWorkStatusPredicate generates the event filter function for work-status-controller in karmada-controller-manager
93+
func NewWorkStatusPredicate(mgr controllerruntime.Manager) predicate.Funcs {
94+
predFunc := func(object client.Object) bool {
95+
obj := object.(*workv1alpha1.Work)
96+
97+
clusterName, err := names.GetClusterName(obj.Namespace)
98+
if err != nil {
99+
klog.Errorf("Failed to get member cluster name for work %s/%s", obj.Namespace, obj.Name)
100+
return false
101+
}
102+
103+
clusterObj, err := util.GetCluster(mgr.GetClient(), clusterName)
104+
if err != nil {
105+
klog.Errorf("Failed to get the given member cluster %s", clusterName)
106+
return false
107+
}
108+
109+
return clusterObj.Spec.SyncMode == clusterv1alpha1.Push
110+
}
111+
return newWorkStatusPredicate(predFunc)
112+
}
113+
114+
// NewWorkStatusPredicateOnAgent generates the event filter function for work-status-controller in karmada-agent
115+
func NewWorkStatusPredicateOnAgent(curClusterName string) predicate.Funcs {
116+
predFunc := func(object client.Object) bool {
117+
clusterName, err := names.GetClusterName(object.GetNamespace())
118+
if err != nil {
119+
klog.Errorf("Failed to get member cluster name for work %s/%s", object.GetNamespace(), object.GetName())
120+
return false
121+
}
122+
return clusterName == curClusterName
123+
}
124+
return newWorkStatusPredicate(predFunc)
125+
}
126+
71127
// NewPredicateForServiceExportController generates an event filter function for ServiceExport controller running by karmada-controller-manager.
72128
func NewPredicateForServiceExportController(mgr controllerruntime.Manager) predicate.Funcs {
73129
predFunc := func(eventType string, object client.Object) bool {

0 commit comments

Comments
 (0)