Skip to content

Commit 880576a

Browse files
Merge pull request #2624 from qiujian16/fix-synctarget-enqueue
🐛 Enqueue location upon synctarget update
2 parents ee81cfe + 97b7b0c commit 880576a

File tree

1 file changed

+34
-49
lines changed

1 file changed

+34
-49
lines changed

pkg/reconciler/workload/placement/placement_controller.go

Lines changed: 34 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import (
3737

3838
apisv1alpha1 "github.com/kcp-dev/kcp/pkg/apis/apis/v1alpha1"
3939
"github.com/kcp-dev/kcp/pkg/apis/core"
40-
corev1alpha1 "github.com/kcp-dev/kcp/pkg/apis/core/v1alpha1"
4140
schedulingv1alpha1 "github.com/kcp-dev/kcp/pkg/apis/scheduling/v1alpha1"
4241
workloadv1alpha1 "github.com/kcp-dev/kcp/pkg/apis/workload/v1alpha1"
4342
kcpclientset "github.com/kcp-dev/kcp/pkg/client/clientset/versioned/cluster"
@@ -101,23 +100,25 @@ func NewController(
101100
indexers.ByLogicalClusterPathAndName: indexers.IndexByLogicalClusterPathAndName,
102101
})
103102

103+
logger := logging.WithReconciler(klog.Background(), ControllerName)
104+
104105
locationInformer.Informer().AddEventHandler(
105106
cache.ResourceEventHandlerFuncs{
106-
AddFunc: c.enqueueLocation,
107+
AddFunc: func(obj interface{}) { c.enqueueLocation(obj, logger) },
107108
UpdateFunc: func(old, obj interface{}) {
108109
oldLoc := old.(*schedulingv1alpha1.Location)
109110
newLoc := obj.(*schedulingv1alpha1.Location)
110111
if !reflect.DeepEqual(oldLoc.Spec, newLoc.Spec) || !reflect.DeepEqual(oldLoc.Labels, newLoc.Labels) {
111-
c.enqueueLocation(obj)
112+
c.enqueueLocation(obj, logger)
112113
}
113114
},
114-
DeleteFunc: c.enqueueLocation,
115+
DeleteFunc: func(obj interface{}) { c.enqueueLocation(obj, logger) },
115116
},
116117
)
117118

118119
syncTargetInformer.Informer().AddEventHandler(
119120
cache.ResourceEventHandlerFuncs{
120-
AddFunc: c.enqueueSyncTarget,
121+
AddFunc: func(obj interface{}) { c.enqueueSyncTarget(obj, logger) },
121122
UpdateFunc: func(old, obj interface{}) {
122123
oldCluster := old.(*workloadv1alpha1.SyncTarget)
123124
oldClusterCopy := *oldCluster
@@ -137,24 +138,23 @@ func NewController(
137138

138139
// compare ignoring heart-beat
139140
if !reflect.DeepEqual(oldClusterCopy, newClusterCopy) {
140-
c.enqueueSyncTarget(obj)
141+
c.enqueueSyncTarget(obj, logger)
141142
}
142143
},
143-
DeleteFunc: c.enqueueSyncTarget,
144+
DeleteFunc: func(obj interface{}) { c.enqueueSyncTarget(obj, logger) },
144145
},
145146
)
146147

147-
logger := logging.WithReconciler(klog.Background(), ControllerName)
148148
placementInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
149-
AddFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger, "") },
150-
UpdateFunc: func(_, obj interface{}) { c.enqueuePlacement(obj, logger, "") },
151-
DeleteFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger, "") },
149+
AddFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger) },
150+
UpdateFunc: func(_, obj interface{}) { c.enqueuePlacement(obj, logger) },
151+
DeleteFunc: func(obj interface{}) { c.enqueuePlacement(obj, logger) },
152152
})
153153

154154
apiBindingInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
155-
AddFunc: c.enqueueAPIBinding,
156-
UpdateFunc: func(_, obj interface{}) { c.enqueueAPIBinding(obj) },
157-
DeleteFunc: c.enqueueAPIBinding,
155+
AddFunc: func(obj interface{}) { c.enqueueAPIBinding(obj, logger) },
156+
UpdateFunc: func(_, obj interface{}) { c.enqueueAPIBinding(obj, logger) },
157+
DeleteFunc: func(obj interface{}) { c.enqueueAPIBinding(obj, logger) },
158158
})
159159

160160
return c, nil
@@ -188,7 +188,7 @@ type controller struct {
188188
}
189189

190190
// enqueueLocation finds placement ref to this location at first, and then namespaces bound to this placement.
191-
func (c *controller) enqueueLocation(obj interface{}) {
191+
func (c *controller) enqueueLocation(obj interface{}, logger logr.Logger) {
192192
if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok {
193193
obj = tombstone.Obj
194194
}
@@ -215,24 +215,24 @@ func (c *controller) enqueueLocation(obj interface{}) {
215215
placements = append(placements, placementsByPath...)
216216
}
217217

218-
logger := logging.WithObject(logging.WithReconciler(klog.Background(), ControllerName), location)
218+
logger = logger.WithValues(logging.FromPrefix("locationReason", location)...)
219219
for _, placement := range placements {
220-
c.enqueuePlacement(placement, logger, " because of Location")
220+
c.enqueuePlacement(placement, logger)
221221
}
222222
}
223223

224-
func (c *controller) enqueuePlacement(obj interface{}, logger logr.Logger, logSuffix string) {
224+
func (c *controller) enqueuePlacement(obj interface{}, logger logr.Logger) {
225225
key, err := kcpcache.DeletionHandlingMetaClusterNamespaceKeyFunc(obj)
226226
if err != nil {
227227
runtime.HandleError(err)
228228
return
229229
}
230230

231-
logging.WithQueueKey(logger, key).V(2).Info(fmt.Sprintf("queueing Placement%s", logSuffix))
231+
logging.WithQueueKey(logger, key).V(2).Info("queueing Placement")
232232
c.queue.Add(key)
233233
}
234234

235-
func (c *controller) enqueueAPIBinding(obj interface{}) {
235+
func (c *controller) enqueueAPIBinding(obj interface{}, logger logr.Logger) {
236236
key, err := kcpcache.DeletionHandlingMetaClusterNamespaceKeyFunc(obj)
237237
if err != nil {
238238
runtime.HandleError(err)
@@ -250,50 +250,35 @@ func (c *controller) enqueueAPIBinding(obj interface{}) {
250250
return
251251
}
252252

253-
logger := logging.WithObject(logging.WithReconciler(klog.Background(), ControllerName), obj.(*apisv1alpha1.APIBinding))
253+
logger = logger.WithValues(logging.FromPrefix("apiBindingReason", obj.(*apisv1alpha1.APIBinding))...)
254+
254255
for _, placement := range placements {
255-
c.enqueuePlacement(placement, logger, " because of APIBinding")
256+
c.enqueuePlacement(placement, logger)
256257
}
257258
}
258259

259-
func (c *controller) enqueueSyncTarget(obj interface{}) {
260-
key, err := kcpcache.DeletionHandlingMetaClusterNamespaceKeyFunc(obj)
261-
if err != nil {
262-
runtime.HandleError(err)
263-
return
260+
func (c *controller) enqueueSyncTarget(obj interface{}, logger logr.Logger) {
261+
if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok {
262+
obj = tombstone.Obj
264263
}
265264

266-
clusterName, _, _, err := kcpcache.SplitMetaClusterNamespaceKey(key)
267-
if err != nil {
268-
runtime.HandleError(err)
265+
syncTarget, ok := obj.(*workloadv1alpha1.SyncTarget)
266+
if !ok {
267+
runtime.HandleError(fmt.Errorf("unexpected object type: %T", obj))
269268
return
270269
}
271270

272-
cluster, err := c.logicalClusterLister.Cluster(clusterName).Get(corev1alpha1.LogicalClusterName)
271+
// Get all locations in the same cluster and enqueue locations.
272+
locations, err := c.locationLister.Cluster(logicalcluster.From(syncTarget)).List(labels.Everything())
273273
if err != nil {
274274
runtime.HandleError(err)
275275
return
276276
}
277277

278-
// placements referencing by cluster name
279-
placements, err := c.placementIndexer.ByIndex(bySelectedLocationPath, logicalcluster.From(cluster).String())
280-
if err != nil {
281-
runtime.HandleError(err)
282-
return
283-
}
284-
if path := cluster.Annotations[core.LogicalClusterPathAnnotationKey]; path != "" {
285-
// placements referencing by path
286-
placementsByPath, err := c.placementIndexer.ByIndex(bySelectedLocationPath, path)
287-
if err != nil {
288-
runtime.HandleError(err)
289-
return
290-
}
291-
placements = append(placements, placementsByPath...)
292-
}
278+
logger = logger.WithValues(logging.FromPrefix("syncTargetReason", syncTarget)...)
293279

294-
logger := logging.WithObject(logging.WithReconciler(klog.Background(), ControllerName), obj.(*workloadv1alpha1.SyncTarget))
295-
for _, placement := range placements {
296-
c.enqueuePlacement(placement, logger, " because of SyncTarget")
280+
for _, location := range locations {
281+
c.enqueueLocation(location, logger)
297282
}
298283
}
299284

0 commit comments

Comments
 (0)