Skip to content

Commit ad6e33a

Browse files
authored
fix: let NNCResonciler process update events with different generations when IPAMv2 is enabled (#3279)
* fix: let NNCReconciler process every update when IPAMv2 is enabled * refactor: cleanup PredicateFunc usage Group the predicate funcs into either specific event filters or the "universal" filters which get applied to every event type. Then And() them which is what controller-runtime event_handler is functionally doing anyway. link: https://github.com/kubernetes-sigs/controller-runtime/blob/aea2e32a936584b06ae6f7992f856fe7292b0297/pkg/internal/source/event_handler.go#L116 * revert: "refactor: cleanup PredicateFunc usage" This reverts commit 67983d0. * chore: reduce refactoring * chore: just pass bool
1 parent 4773840 commit ad6e33a

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

cns/kubecontroller/nodenetworkconfig/reconciler.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,9 @@ func (r *Reconciler) Started(ctx context.Context) (bool, error) {
157157
}
158158

159159
// SetupWithManager Sets up the reconciler with a new manager, filtering using NodeNetworkConfigFilter on nodeName.
160-
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, node *v1.Node) error {
160+
// filterGenerationChange will check the old and new object's generation and only reconcile updates where the
161+
// generation is the same. This is typically used in IPAMv1 but should be set to false in IPAMv2.
162+
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, node *v1.Node, filterGenerationChange bool) error {
161163
r.nnccli = nodenetworkconfig.NewClient(mgr.GetClient())
162164
err := ctrl.NewControllerManagedBy(mgr).
163165
For(&v1alpha.NodeNetworkConfig{}).
@@ -166,20 +168,20 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, node *v1.Node) error {
166168
DeleteFunc: func(event.DeleteEvent) bool {
167169
return false
168170
},
169-
}).
170-
WithEventFilter(predicate.NewPredicateFuncs(func(object client.Object) bool {
171-
// match on node controller ref for all other events.
172-
return metav1.IsControlledBy(object, node)
173-
})).
174-
WithEventFilter(predicate.Funcs{
175-
// check that the generation is the same - status changes don't update generation.
176171
UpdateFunc: func(ue event.UpdateEvent) bool {
177172
if ue.ObjectOld == nil || ue.ObjectNew == nil {
178173
return false
179174
}
180-
return ue.ObjectOld.GetGeneration() == ue.ObjectNew.GetGeneration()
175+
if filterGenerationChange {
176+
return ue.ObjectOld.GetGeneration() == ue.ObjectNew.GetGeneration()
177+
}
178+
return true
181179
},
182180
}).
181+
WithEventFilter(predicate.NewPredicateFuncs(func(object client.Object) bool {
182+
// match on node controller ref for all other events.
183+
return metav1.IsControlledBy(object, node)
184+
})).
183185
WithEventFilter(predicate.NewPredicateFuncs(func(object client.Object) bool {
184186
// only process events on objects that are not being deleted.
185187
return object.GetDeletionTimestamp().IsZero()

cns/service/main.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,7 @@ func main() {
10321032
// Start fs watcher here
10331033
z.Info("AsyncPodDelete is enabled")
10341034
logger.Printf("AsyncPodDelete is enabled")
1035-
cnsclient, err := cnsclient.New("", cnsReqTimeout) //nolint
1035+
cnsclient, err := cnsclient.New("", cnsReqTimeout) // nolint
10361036
if err != nil {
10371037
z.Error("failed to create cnsclient", zap.Error(err))
10381038
}
@@ -1548,7 +1548,10 @@ func InitializeCRDState(ctx context.Context, httpRestService cns.HTTPService, cn
15481548
nodeIP := configuration.NodeIP()
15491549
nncReconciler := nncctrl.NewReconciler(httpRestServiceImplementation, poolMonitor, nodeIP)
15501550
// pass Node to the Reconciler for Controller xref
1551-
if err := nncReconciler.SetupWithManager(manager, node); err != nil { //nolint:govet // intentional shadow
1551+
// IPAMv1 - reconcile only status changes (where generation doesn't change).
1552+
// IPAMv2 - reconcile all updates.
1553+
filterGenerationChange := !cnsconfig.EnableIPAMv2
1554+
if err := nncReconciler.SetupWithManager(manager, node, filterGenerationChange); err != nil { //nolint:govet // intentional shadow
15521555
return errors.Wrapf(err, "failed to setup nnc reconciler with manager")
15531556
}
15541557

@@ -1618,7 +1621,7 @@ func InitializeCRDState(ctx context.Context, httpRestService cns.HTTPService, cn
16181621
// wait for the Reconciler to run once on a NNC that was made for this Node.
16191622
// the nncReadyCtx has a timeout of 15 minutes, after which we will consider
16201623
// this false and the NNC Reconciler stuck/failed, log and retry.
1621-
nncReadyCtx, cancel := context.WithTimeout(ctx, 15*time.Minute) //nolint // it will time out and not leak
1624+
nncReadyCtx, cancel := context.WithTimeout(ctx, 15*time.Minute) // nolint // it will time out and not leak
16221625
if started, err := nncReconciler.Started(nncReadyCtx); !started {
16231626
logger.Errorf("NNC reconciler has not started, does the NNC exist? err: %v", err)
16241627
nncReconcilerStartFailures.Inc()

0 commit comments

Comments
 (0)