Skip to content

Commit 5b95532

Browse files
committed
bugfix: optimize routes status unnecessary deepcopy.
Signed-off-by: qicz <[email protected]>
1 parent 6f5ae8e commit 5b95532

File tree

2 files changed

+131
-164
lines changed

2 files changed

+131
-164
lines changed

internal/provider/kubernetes/status.go

+124-60
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
6666
r.statusUpdater.Send(Update{
6767
NamespacedName: key,
6868
Resource: new(gwapiv1.HTTPRoute),
69-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
69+
Mutator: MutatorFunc(func(obj client.Object) bool {
7070
h, ok := obj.(*gwapiv1.HTTPRoute)
7171
if !ok {
7272
err := fmt.Errorf("unsupported object type %T", obj)
7373
errChan <- err
7474
panic(err)
7575
}
76-
hCopy := h.DeepCopy()
77-
hCopy.Status.Parents = val.Parents
78-
return hCopy
76+
77+
if isStatusEqual(h.Status.Parents, val.Parents) {
78+
return true
79+
}
80+
81+
h.Status.Parents = val.Parents
82+
return false
7983
}),
8084
})
8185
},
@@ -96,16 +100,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
96100
r.statusUpdater.Send(Update{
97101
NamespacedName: key,
98102
Resource: new(gwapiv1.GRPCRoute),
99-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
103+
Mutator: MutatorFunc(func(obj client.Object) bool {
100104
h, ok := obj.(*gwapiv1.GRPCRoute)
101105
if !ok {
102106
err := fmt.Errorf("unsupported object type %T", obj)
103107
errChan <- err
104108
panic(err)
105109
}
106-
hCopy := h.DeepCopy()
107-
hCopy.Status.Parents = val.Parents
108-
return hCopy
110+
111+
if isStatusEqual(h.Status.Parents, val.Parents) {
112+
return true
113+
}
114+
115+
h.Status.Parents = val.Parents
116+
return false
109117
}),
110118
})
111119
},
@@ -128,16 +136,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
128136
r.statusUpdater.Send(Update{
129137
NamespacedName: key,
130138
Resource: new(gwapiv1a2.TLSRoute),
131-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
139+
Mutator: MutatorFunc(func(obj client.Object) bool {
132140
t, ok := obj.(*gwapiv1a2.TLSRoute)
133141
if !ok {
134142
err := fmt.Errorf("unsupported object type %T", obj)
135143
errChan <- err
136144
panic(err)
137145
}
138-
tCopy := t.DeepCopy()
139-
tCopy.Status.Parents = val.Parents
140-
return tCopy
146+
147+
if isStatusEqual(t.Status.Parents, val.Parents) {
148+
return true
149+
}
150+
151+
t.Status.Parents = val.Parents
152+
return false
141153
}),
142154
})
143155
},
@@ -160,16 +172,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
160172
r.statusUpdater.Send(Update{
161173
NamespacedName: key,
162174
Resource: new(gwapiv1a2.TCPRoute),
163-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
175+
Mutator: MutatorFunc(func(obj client.Object) bool {
164176
t, ok := obj.(*gwapiv1a2.TCPRoute)
165177
if !ok {
166178
err := fmt.Errorf("unsupported object type %T", obj)
167179
errChan <- err
168180
panic(err)
169181
}
170-
tCopy := t.DeepCopy()
171-
tCopy.Status.Parents = val.Parents
172-
return tCopy
182+
183+
if isStatusEqual(t.Status.Parents, val.Parents) {
184+
return true
185+
}
186+
187+
t.Status.Parents = val.Parents
188+
return false
173189
}),
174190
})
175191
},
@@ -192,16 +208,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
192208
r.statusUpdater.Send(Update{
193209
NamespacedName: key,
194210
Resource: new(gwapiv1a2.UDPRoute),
195-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
211+
Mutator: MutatorFunc(func(obj client.Object) bool {
196212
t, ok := obj.(*gwapiv1a2.UDPRoute)
197213
if !ok {
198214
err := fmt.Errorf("unsupported object type %T", obj)
199215
errChan <- err
200216
panic(err)
201217
}
202-
tCopy := t.DeepCopy()
203-
tCopy.Status.Parents = val.Parents
204-
return tCopy
218+
219+
if isStatusEqual(t.Status.Parents, val.Parents) {
220+
return true
221+
}
222+
223+
t.Status.Parents = val.Parents
224+
return false
205225
}),
206226
})
207227
},
@@ -224,16 +244,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
224244
r.statusUpdater.Send(Update{
225245
NamespacedName: key,
226246
Resource: new(egv1a1.EnvoyPatchPolicy),
227-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
247+
Mutator: MutatorFunc(func(obj client.Object) bool {
228248
t, ok := obj.(*egv1a1.EnvoyPatchPolicy)
229249
if !ok {
230250
err := fmt.Errorf("unsupported object type %T", obj)
231251
errChan <- err
232252
panic(err)
233253
}
234-
tCopy := t.DeepCopy()
235-
tCopy.Status = *val
236-
return tCopy
254+
255+
if isStatusEqual(t.Status, *val) {
256+
return true
257+
}
258+
259+
t.Status = *val
260+
return false
237261
}),
238262
})
239263
},
@@ -256,16 +280,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
256280
r.statusUpdater.Send(Update{
257281
NamespacedName: key,
258282
Resource: new(egv1a1.ClientTrafficPolicy),
259-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
283+
Mutator: MutatorFunc(func(obj client.Object) bool {
260284
t, ok := obj.(*egv1a1.ClientTrafficPolicy)
261285
if !ok {
262286
err := fmt.Errorf("unsupported object type %T", obj)
263287
errChan <- err
264288
panic(err)
265289
}
266-
tCopy := t.DeepCopy()
267-
tCopy.Status = *val
268-
return tCopy
290+
291+
if isStatusEqual(t.Status, *val) {
292+
return true
293+
}
294+
295+
t.Status = *val
296+
return false
269297
}),
270298
})
271299
},
@@ -288,16 +316,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
288316
r.statusUpdater.Send(Update{
289317
NamespacedName: key,
290318
Resource: new(egv1a1.BackendTrafficPolicy),
291-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
319+
Mutator: MutatorFunc(func(obj client.Object) bool {
292320
t, ok := obj.(*egv1a1.BackendTrafficPolicy)
293321
if !ok {
294322
err := fmt.Errorf("unsupported object type %T", obj)
295323
errChan <- err
296324
panic(err)
297325
}
298-
tCopy := t.DeepCopy()
299-
tCopy.Status = *val
300-
return tCopy
326+
327+
if isStatusEqual(t.Status, *val) {
328+
return true
329+
}
330+
331+
t.Status = *val
332+
return false
301333
}),
302334
})
303335
},
@@ -320,16 +352,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
320352
r.statusUpdater.Send(Update{
321353
NamespacedName: key,
322354
Resource: new(egv1a1.SecurityPolicy),
323-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
355+
Mutator: MutatorFunc(func(obj client.Object) bool {
324356
t, ok := obj.(*egv1a1.SecurityPolicy)
325357
if !ok {
326358
err := fmt.Errorf("unsupported object type %T", obj)
327359
errChan <- err
328360
panic(err)
329361
}
330-
tCopy := t.DeepCopy()
331-
tCopy.Status = *val
332-
return tCopy
362+
363+
if isStatusEqual(t.Status, *val) {
364+
return true
365+
}
366+
367+
t.Status = *val
368+
return false
333369
}),
334370
})
335371
},
@@ -350,16 +386,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
350386
r.statusUpdater.Send(Update{
351387
NamespacedName: key,
352388
Resource: new(gwapiv1a3.BackendTLSPolicy),
353-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
389+
Mutator: MutatorFunc(func(obj client.Object) bool {
354390
t, ok := obj.(*gwapiv1a3.BackendTLSPolicy)
355391
if !ok {
356392
err := fmt.Errorf("unsupported object type %T", obj)
357393
errChan <- err
358394
panic(err)
359395
}
360-
tCopy := t.DeepCopy()
361-
tCopy.Status = *val
362-
return tCopy
396+
397+
if isStatusEqual(t.Status, *val) {
398+
return true
399+
}
400+
401+
t.Status = *val
402+
return false
363403
}),
364404
})
365405
},
@@ -382,16 +422,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
382422
r.statusUpdater.Send(Update{
383423
NamespacedName: key,
384424
Resource: new(egv1a1.EnvoyExtensionPolicy),
385-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
425+
Mutator: MutatorFunc(func(obj client.Object) bool {
386426
t, ok := obj.(*egv1a1.EnvoyExtensionPolicy)
387427
if !ok {
388428
err := fmt.Errorf("unsupported object type %T", obj)
389429
errChan <- err
390430
panic(err)
391431
}
392-
tCopy := t.DeepCopy()
393-
tCopy.Status = *val
394-
return tCopy
432+
433+
if isStatusEqual(t.Status, *val) {
434+
return true
435+
}
436+
437+
t.Status = *val
438+
return false
395439
}),
396440
})
397441
},
@@ -414,16 +458,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
414458
r.statusUpdater.Send(Update{
415459
NamespacedName: key,
416460
Resource: new(egv1a1.Backend),
417-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
461+
Mutator: MutatorFunc(func(obj client.Object) bool {
418462
t, ok := obj.(*egv1a1.Backend)
419463
if !ok {
420464
err := fmt.Errorf("unsupported object type %T", obj)
421465
errChan <- err
422466
panic(err)
423467
}
424-
tCopy := t.DeepCopy()
425-
tCopy.Status = *val
426-
return tCopy
468+
469+
if isStatusEqual(t.Status, *val) {
470+
return true
471+
}
472+
473+
t.Status = *val
474+
return false
427475
}),
428476
})
429477
},
@@ -450,16 +498,20 @@ func (r *gatewayAPIReconciler) subscribeAndUpdateStatus(ctx context.Context, ext
450498
r.statusUpdater.Send(Update{
451499
NamespacedName: key.NamespacedName,
452500
Resource: &obj,
453-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
501+
Mutator: MutatorFunc(func(obj client.Object) bool {
454502
t, ok := obj.(*unstructured.Unstructured)
455503
if !ok {
456504
err := fmt.Errorf("unsupported object type %T", obj)
457505
errChan <- err
458506
panic(err)
459507
}
460-
tCopy := t.DeepCopy()
461-
tCopy.Object["status"] = *val
462-
return tCopy
508+
509+
if isStatusEqual(t.Object["status"], *val) {
510+
return true
511+
}
512+
513+
t.Object["status"] = *val
514+
return false
463515
}),
464516
})
465517
},
@@ -499,16 +551,22 @@ func (r *gatewayAPIReconciler) updateStatusForGateway(ctx context.Context, gtw *
499551
r.statusUpdater.Send(Update{
500552
NamespacedName: key,
501553
Resource: new(gwapiv1.Gateway),
502-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
554+
Mutator: MutatorFunc(func(obj client.Object) bool {
503555
g, ok := obj.(*gwapiv1.Gateway)
504556
if !ok {
505557
panic(fmt.Sprintf("unsupported object type %T", obj))
506558
}
507-
gCopy := g.DeepCopy()
508-
gCopy.Status.Conditions = gtw.Status.Conditions
509-
gCopy.Status.Addresses = gtw.Status.Addresses
510-
gCopy.Status.Listeners = gtw.Status.Listeners
511-
return gCopy
559+
560+
if isStatusEqual(g.Status.Conditions, gtw.Status.Conditions) &&
561+
isStatusEqual(g.Status.Addresses, gtw.Status.Addresses) &&
562+
isStatusEqual(g.Status.Listeners, gtw.Status.Listeners) {
563+
return true
564+
}
565+
566+
g.Status.Conditions = gtw.Status.Conditions
567+
g.Status.Addresses = gtw.Status.Addresses
568+
g.Status.Listeners = gtw.Status.Listeners
569+
return false
512570
}),
513571
})
514572
}
@@ -524,13 +582,19 @@ func (r *gatewayAPIReconciler) updateStatusForGatewayClass(
524582
r.statusUpdater.Send(Update{
525583
NamespacedName: types.NamespacedName{Name: gc.Name},
526584
Resource: &gwapiv1.GatewayClass{},
527-
Mutator: MutatorFunc(func(obj client.Object) client.Object {
585+
Mutator: MutatorFunc(func(obj client.Object) bool {
528586
gc, ok := obj.(*gwapiv1.GatewayClass)
529587
if !ok {
530588
panic(fmt.Sprintf("unsupported object type %T", obj))
531589
}
532590

533-
return status.SetGatewayClassAccepted(gc.DeepCopy(), accepted, reason, msg)
591+
gcp := status.SetGatewayClassAccepted(gc.DeepCopy(), accepted, reason, msg)
592+
if isStatusEqual(gcp.Status, gc.Status) {
593+
return true
594+
}
595+
596+
gc.Status = gcp.Status
597+
return false
534598
}),
535599
})
536600
} else {

0 commit comments

Comments
 (0)