kubernetes-sigs / kubernetes-sigs/node-readiness-controller

bug: processAllNodesForRule swallows node evaluation errors, preventing reconcile retries

Open
#234 1 comment 0 reactions 1 assignee Claimed by @dorodb-web22 View on GitHub
kind/bug
Dominant language
Go
Stars
163
Forks
74
Avg merge
2d 18h
Merged PRs (30d)
9

Description

## Describe the bug

`RuleReadinessController.processAllNodesForRule` catches errors from `evaluateRuleForNode` but always returns `nil`, even when evaluations fail:

```go
for _, node := range nodeList.Items {
if r.ruleAppliesTo(ctx, rule, &node) {
if err := r.evaluateRuleForNode(ctx, rule, &node); err != nil {
log.Error(err, "Failed to evaluate node for rule", ...)
r.recordNodeFailure(rule, node.Name, "EvaluationError", err.Error())
metrics.Failures.WithLabelValues(rule.Name, "EvaluationError").Inc()
// error is dropped here
}
}
}
return nil // always nil
```

Because `processAllNodesForRule` always returns `nil`, the calling `RuleReconciler.Reconcile` at line 152 never sees the failure, so controller-runtime treats every reconciliation as successful and does not trigger a requeue/backoff.

This is the same class of bug fixed in #222 for the node reconciler path. This function is the rule reconciler path equivalent.

## Expected behavior

Transient failures during node evaluation (e.g. API conflicts, patch errors) should cause `processAllNodesForRule` to return an aggregated error so that controller-runtime can requeue with backoff.

## Suggested fix

Accumulate errors and return `errors.Join(errs...)`, same pattern as `processNodeAgainstAllRules` after #222. Existing behavior of continuing across all nodes is preserved.

/kind bug

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.