From f0f6924b0783ef69885761ea29cf1030c60cc8bf Mon Sep 17 00:00:00 2001 From: csviri Date: Sat, 6 Jun 2026 16:06:52 +0200 Subject: [PATCH] fix: propagate event when resource is marked for deletion --- .../event/source/informer/EventFilterDetails.java | 8 +++++++- .../source/informer/TemporaryResourceCache.java | 14 +++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/EventFilterDetails.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/EventFilterDetails.java index b747c69dff..2728537d24 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/EventFilterDetails.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/EventFilterDetails.java @@ -27,6 +27,7 @@ class EventFilterDetails { private int activeUpdates = 0; private ResourceEvent lastEvent; private String lastOwnUpdatedResourceVersion; + private boolean becameMarkedForDeletion = false; public void increaseActiveUpdates() { activeUpdates = activeUpdates + 1; @@ -56,7 +57,8 @@ public void setLastEvent(ResourceEvent event) { public Optional getLatestEventAfterLastUpdateEvent() { if (lastEvent != null - && (lastOwnUpdatedResourceVersion == null + && (becameMarkedForDeletion + || lastOwnUpdatedResourceVersion == null || ReconcilerUtilsInternal.compareResourceVersions( lastEvent.getResource().orElseThrow().getMetadata().getResourceVersion(), lastOwnUpdatedResourceVersion) @@ -69,4 +71,8 @@ public Optional getLatestEventAfterLastUpdateEvent() { public int getActiveUpdates() { return activeUpdates; } + + public void setBecameMarkedForDeletion(boolean becameMarkedForDeletion) { + this.becameMarkedForDeletion = becameMarkedForDeletion; + } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/TemporaryResourceCache.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/TemporaryResourceCache.java index 405f52cc8d..aa8874b2f1 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/TemporaryResourceCache.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/TemporaryResourceCache.java @@ -132,6 +132,9 @@ private synchronized EventHandling onEvent( } var cached = cache.get(resourceId); EventHandling result = EventHandling.NEW; + // todo do this just for the primary resource? + boolean becameMarkedForDeletion = + resourceBecameMarkedForDeletion(prevResourceVersion, resource); if (cached != null) { int comp = ReconcilerUtilsInternal.compareResourceVersions(resource, cached); if (comp >= 0 || unknownState) { @@ -155,9 +158,12 @@ private synchronized EventHandling onEvent( delete ? new ResourceDeleteEvent(ResourceAction.DELETED, resourceId, resource, unknownState) : new ExtendedResourceEvent(action, resourceId, resource, prevResourceVersion)); + if (becameMarkedForDeletion) { + ed.setBecameMarkedForDeletion(true); + } return EventHandling.DEFER; } else { - return result; + return becameMarkedForDeletion ? EventHandling.NEW : result; } } @@ -274,4 +280,10 @@ synchronized boolean isEmpty() { synchronized Map getResources() { return Collections.unmodifiableMap(cache); } + + private boolean resourceBecameMarkedForDeletion(T prevResource, T newResource) { + return prevResource != null + && !prevResource.isMarkedForDeletion() + && newResource.isMarkedForDeletion(); + } }