Skip to content

LeaderAwareFuncs in genreconciler do not respect classValue #2526

Open
@n3wscott

Description

@n3wscott

On leader promotion, the controller will enqueue all known instances of Kind without filtering on the provided classValue.

		LeaderAwareFuncs: reconciler.LeaderAwareFuncs{
			PromoteFunc: func(bkt reconciler.Bucket, enq func(reconciler.Bucket, types.NamespacedName)) error {
				all, err := lister.List(labels.Everything())
				if err != nil {
					return err
				}
				for _, elt := range all {
					if promoteFilterFunc != nil {
						if ok := promoteFilterFunc(elt); !ok {
							continue
						}
					}
					enq(bkt, types.NamespacedName{
						Namespace: elt.GetNamespace(),
						Name:      elt.GetName(),
					})
				}
				return nil
			},
		},

It is only in Reconcile(key) that the Kind is filtered and prevented from calling down into ReconcileKind

	if classValue, found := original.GetAnnotations()[ClassAnnotationKey]; !found || classValue != r.classValue {
		logger.Debugw("Skip reconciling resource, class annotation value does not match reconciler instance value.",
			zap.String("classKey", ClassAnnotationKey),
			zap.String("issue", classValue+"!="+r.classValue))
		return nil
	}

The side effect here is every Kind is enqueued and then noop'ed from the queue. Not a huge issue, but for a cluster with many instances of several kinds, it will be extra work each reconciler does not need to do.

Possible Solution

Perhaps we generate a default filter function that can be overloaded if one is provided when we generate a reconciler with a classValue?

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugCategorizes issue or PR as related to a bug.lifecycle/frozenIndicates that an issue or PR should not be auto-closed due to staleness.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions