diff --git a/go.mod b/go.mod index 3fedeb10..8c387672 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( k8s.io/code-generator v0.34.2 k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b knative.dev/hack v0.0.0-20251117013754-67a5b048bc27 - knative.dev/pkg v0.0.0-20251118173915-745990698d3c + knative.dev/pkg v0.0.0-20251119125415-ab67eb7f8660 ) require ( diff --git a/go.sum b/go.sum index 84bca11a..bb1ff1ad 100644 --- a/go.sum +++ b/go.sum @@ -186,8 +186,8 @@ k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8 k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= knative.dev/hack v0.0.0-20251117013754-67a5b048bc27 h1:yPzDTKOFtSYHxgXB2N7+nWT/3doNqPNCbCf7Bf9PeAE= knative.dev/hack v0.0.0-20251117013754-67a5b048bc27/go.mod h1:L5RzHgbvam0u8QFHfzCX6MKxu/a/gIGEdaRBqNiVbl0= -knative.dev/pkg v0.0.0-20251118173915-745990698d3c h1:khjCe035kZgoJqE9HwQTEjS/WZCKRpNPlNkbh6Yr+Gc= -knative.dev/pkg v0.0.0-20251118173915-745990698d3c/go.mod h1:iVOYfi7BiB0jQEEiW3NUfBHVOjc0QIbdOqdNs47YEoI= +knative.dev/pkg v0.0.0-20251119125415-ab67eb7f8660 h1:4lJPD8CTsOZ6cXFYkm3LtZ8bruSY9OQpyIFS6S5NPGQ= +knative.dev/pkg v0.0.0-20251119125415-ab67eb7f8660/go.mod h1:iVOYfi7BiB0jQEEiW3NUfBHVOjc0QIbdOqdNs47YEoI= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= diff --git a/pkg/client/injection/reconciler/caching/v1alpha1/image/reconciler.go b/pkg/client/injection/reconciler/caching/v1alpha1/image/reconciler.go index 9834058a..a324215b 100644 --- a/pkg/client/injection/reconciler/caching/v1alpha1/image/reconciler.go +++ b/pkg/client/injection/reconciler/caching/v1alpha1/image/reconciler.go @@ -317,6 +317,8 @@ func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error { // This is a wrapped error, don't emit an event. } else if ok, _ := controller.IsRequeueKey(reconcileEvent); ok { // This is a wrapped error, don't emit an event. + } else if errors.IsConflict(reconcileEvent) { + // Conflict errors are expected, don't emit an event. } else { logger.Errorw("Returned an error", zap.Error(reconcileEvent)) r.Recorder.Event(resource, v1.EventTypeWarning, "InternalError", reconcileEvent.Error()) @@ -428,8 +430,10 @@ func (r *reconcilerImpl) updateFinalizersFilteredServerSideApply(ctx context.Con updated, err := patcher.Patch(ctx, resource.Name, types.ApplyPatchType, patch, patchOpts) if err != nil { - r.Recorder.Eventf(resource, v1.EventTypeWarning, "FinalizerUpdateFailed", - "Failed to update finalizers for %q via server-side apply: %v", resource.Name, err) + if !errors.IsConflict(err) { + r.Recorder.Eventf(resource, v1.EventTypeWarning, "FinalizerUpdateFailed", + "Failed to update finalizers for %q via server-side apply: %v", resource.Name, err) + } } else { r.Recorder.Eventf(updated, v1.EventTypeNormal, "FinalizerUpdate", "Updated finalizers for %q via server-side apply", resource.GetName()) @@ -481,8 +485,10 @@ func (r *reconcilerImpl) updateFinalizersFilteredMergePatch(ctx context.Context, resourceName := resource.Name updated, err := patcher.Patch(ctx, resourceName, types.MergePatchType, patch, metav1.PatchOptions{}) if err != nil { - r.Recorder.Eventf(existing, v1.EventTypeWarning, "FinalizerUpdateFailed", - "Failed to update finalizers for %q: %v", resourceName, err) + if !errors.IsConflict(err) { + r.Recorder.Eventf(existing, v1.EventTypeWarning, "FinalizerUpdateFailed", + "Failed to update finalizers for %q: %v", resourceName, err) + } } else { r.Recorder.Eventf(updated, v1.EventTypeNormal, "FinalizerUpdate", "Updated %q finalizers", resource.GetName()) diff --git a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler/reconciler_reconciler.go b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler/reconciler_reconciler.go index 40ee904f..b7c11b55 100644 --- a/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler/reconciler_reconciler.go +++ b/vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler/reconciler_reconciler.go @@ -134,6 +134,10 @@ func (g *reconcilerReconcilerGenerator) GenerateType(c *generator.Context, t *ty Package: "k8s.io/apimachinery/pkg/api/errors", Name: "IsNotFound", }), + "apierrsIsConflict": c.Universe.Function(types.Name{ + Package: "k8s.io/apimachinery/pkg/api/errors", + Name: "IsConflict", + }), "metav1GetOptions": c.Universe.Function(types.Name{ Package: "k8s.io/apimachinery/pkg/apis/meta/v1", Name: "GetOptions", @@ -573,6 +577,8 @@ func (r *reconcilerImpl) Reconcile(ctx {{.contextContext|raw}}, key string) erro // This is a wrapped error, don't emit an event. } else if ok, _ := {{ .controllerIsRequeueKey|raw }}(reconcileEvent); ok { // This is a wrapped error, don't emit an event. + } else if {{ .apierrsIsConflict|raw }}(reconcileEvent) { + // Conflict errors are expected, don't emit an event. } else { logger.Errorw("Returned an error", zap.Error(reconcileEvent)) r.Recorder.Event(resource, {{.corev1EventTypeWarning|raw}}, "InternalError", reconcileEvent.Error()) @@ -698,8 +704,10 @@ func (r *reconcilerImpl) updateFinalizersFilteredServerSideApply(ctx {{.contextC updated, err := patcher.Patch(ctx, resource.Name, {{.typesApplyPatchType|raw}}, patch, patchOpts) if err != nil { - r.Recorder.Eventf(resource, {{.corev1EventTypeWarning|raw}}, "FinalizerUpdateFailed", - "Failed to update finalizers for %q via server-side apply: %v", resource.Name, err) + if !{{ .apierrsIsConflict|raw }}(err) { + r.Recorder.Eventf(resource, {{.corev1EventTypeWarning|raw}}, "FinalizerUpdateFailed", + "Failed to update finalizers for %q via server-side apply: %v", resource.Name, err) + } } else { r.Recorder.Eventf(updated, {{.corev1EventTypeNormal|raw}}, "FinalizerUpdate", "Updated finalizers for %q via server-side apply", resource.GetName()) @@ -754,8 +762,10 @@ func (r *reconcilerImpl) updateFinalizersFilteredMergePatch(ctx {{.contextContex resourceName := resource.Name updated, err := patcher.Patch(ctx, resourceName, {{.typesMergePatchType|raw}}, patch, {{.metav1PatchOptions|raw}}{}) if err != nil { - r.Recorder.Eventf(existing, {{.corev1EventTypeWarning|raw}}, "FinalizerUpdateFailed", - "Failed to update finalizers for %q: %v", resourceName, err) + if !{{ .apierrsIsConflict|raw }}(err) { + r.Recorder.Eventf(existing, {{.corev1EventTypeWarning|raw}}, "FinalizerUpdateFailed", + "Failed to update finalizers for %q: %v", resourceName, err) + } } else { r.Recorder.Eventf(updated, {{.corev1EventTypeNormal|raw}}, "FinalizerUpdate", "Updated %q finalizers", resource.GetName()) diff --git a/vendor/knative.dev/pkg/controller/controller.go b/vendor/knative.dev/pkg/controller/controller.go index 6091f55f..184462d0 100644 --- a/vendor/knative.dev/pkg/controller/controller.go +++ b/vendor/knative.dev/pkg/controller/controller.go @@ -28,6 +28,7 @@ import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" @@ -532,23 +533,31 @@ func (c *Impl) processNextWorkItem() bool { } func (c *Impl) handleErr(logger *zap.SugaredLogger, err error, key types.NamespacedName, startTime time.Time) { - if IsSkipKey(err) { + // Check if we should skip this key or if the queue is shutting down. + // We check shutdown here since controller Run might have exited by now + // (since while this item was being processed, queue.Len==0). + if IsSkipKey(err) || c.workQueue.ShuttingDown() { c.workQueue.Forget(key) return } + if ok, delay := IsRequeueKey(err); ok { c.workQueue.AddAfter(key, delay) logger.Debugf("Requeuing key %s (by request) after %v (depth: %d)", safeKey(key), delay, c.workQueue.Len()) return } + // Conflict errors are expected, requeue to retry + if apierrors.IsConflict(err) { + logger.Debugw("Reconcile conflict", zap.Duration("duration", time.Since(startTime))) + c.workQueue.AddRateLimited(key) + return + } + logger.Errorw("Reconcile error", zap.Duration("duration", time.Since(startTime)), zap.Error(err)) // Re-queue the key if it's a transient error. - // We want to check that the queue is shutting down here - // since controller Run might have exited by now (since while this item was - // being processed, queue.Len==0). - if !IsPermanentError(err) && !c.workQueue.ShuttingDown() { + if !IsPermanentError(err) { c.workQueue.AddRateLimited(key) logger.Debugf("Requeuing key %s due to non-permanent error (depth: %d)", safeKey(key), c.workQueue.Len()) return diff --git a/vendor/modules.txt b/vendor/modules.txt index d1023592..cbe66f16 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -733,7 +733,7 @@ k8s.io/utils/trace # knative.dev/hack v0.0.0-20251117013754-67a5b048bc27 ## explicit; go 1.24 knative.dev/hack -# knative.dev/pkg v0.0.0-20251118173915-745990698d3c +# knative.dev/pkg v0.0.0-20251119125415-ab67eb7f8660 ## explicit; go 1.24.0 knative.dev/pkg/apis knative.dev/pkg/apis/duck