diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java index 833e10816d..14c7cf6d1e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java @@ -97,6 +97,9 @@ public synchronized void handleEvent(Event event) { metrics.receivedEvent(event, metricsMetadata); handleEventMarking(event, state); if (!this.running) { + if (state.deleteEventPresent()) { + cleanupForDeletedEvent(state.getId()); + } // events are received and marked, but will be processed when started, see start() method. log.debug("Skipping event: {} because the event processor is not started", event); return; diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java index 880b4a8e14..9d538713c1 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java @@ -452,6 +452,21 @@ void executionOfReconciliationShouldNotStartIfProcessorStopped() throws Interrup .handleExecution(any()); } + @Test + void cleansUpForDeleteEventEvenIfProcessorNotStarted() { + ResourceID resourceID = new ResourceID("test1", "default"); + + eventProcessor = + spy(new EventProcessor(controllerConfiguration(null, rateLimiterMock), + reconciliationDispatcherMock, + eventSourceManagerMock, null)); + + eventProcessor.handleEvent(prepareCREvent(resourceID)); + eventProcessor.handleEvent(new ResourceEvent(ResourceAction.DELETED, resourceID, null)); + eventProcessor.handleEvent(prepareCREvent(resourceID)); + // no exception thrown + } + private ResourceID eventAlreadyUnderProcessing() { when(reconciliationDispatcherMock.handleExecution(any())) .then(