@@ -43,7 +43,7 @@ public class EventProcessor<P extends HasMetadata> implements EventHandler, Life
4343 private final Cache <P > cache ;
4444 private final EventSourceManager <P > eventSourceManager ;
4545 private final RateLimiter <? extends RateLimitState > rateLimiter ;
46- private final ResourceStateManager resourceStateManager = new ResourceStateManager ();
46+ private final ResourceStateManager < P > resourceStateManager = new ResourceStateManager <> ();
4747 private final Map <String , Object > metricsMetadata ;
4848 private ExecutorService executor ;
4949
@@ -121,19 +121,24 @@ public synchronized void handleEvent(Event event) {
121121 }
122122 }
123123
124- private void handleMarkedEventForResource (ResourceState state ) {
125- if (state . deleteEventPresent ( )) {
124+ private void handleMarkedEventForResource (ResourceState < P > state ) {
125+ if (skipDeleteEventProcessing ( state )) {
126126 cleanupForDeletedEvent (state .getId ());
127- } else if (!state .processedMarkForDeletionPresent ()) {
127+ } else if (!state .processedMarkForDeletionPresent ()
128+ && !state .deleteEventReconciliationSubmitted ()) {
128129 submitReconciliationExecution (state );
129130 }
130131 }
131132
132- private void submitReconciliationExecution (ResourceState state ) {
133+ private boolean skipDeleteEventProcessing (ResourceState <P > state ) {
134+ return state .deleteEventPresent () && !controllerConfiguration .reconcileOnPrimaryDelete ();
135+ }
136+
137+ private void submitReconciliationExecution (ResourceState <P > state ) {
133138 try {
134139 boolean controllerUnderExecution = isControllerUnderExecution (state );
135140 final var resourceID = state .getId ();
136- Optional <P > maybeLatest = cache . get (resourceID );
141+ Optional <P > maybeLatest = getCachedResource (resourceID , state );
137142 maybeLatest .ifPresent (MDCUtils ::addResourceInfo );
138143 if (!controllerUnderExecution && maybeLatest .isPresent ()) {
139144 var rateLimit = state .getRateLimit ();
@@ -148,8 +153,15 @@ private void submitReconciliationExecution(ResourceState state) {
148153 }
149154 state .setUnderProcessing (true );
150155 final var latest = maybeLatest .get ();
151- ExecutionScope <P > executionScope = new ExecutionScope <>(state .getRetry ());
152- state .unMarkEventReceived ();
156+ ExecutionScope <P > executionScope =
157+ new ExecutionScope <>(state .getRetry (), state .deleteEventPresent ());
158+
159+ if (state .deleteEventPresent ()) {
160+ state .markDeleteEventReconciliationSubmitted ();
161+ } else {
162+ state .unMarkEventReceived ();
163+ }
164+
153165 metrics .reconcileCustomResource (latest , state .getRetry (), metricsMetadata );
154166 log .debug ("Executing events for custom resource. Scope: {}" , executionScope );
155167 executor .execute (new ReconcilerExecutor (resourceID , executionScope ));
@@ -164,7 +176,7 @@ private void submitReconciliationExecution(ResourceState state) {
164176 // there can be multiple reasons why the primary resource is not present, one is that the
165177 // informer is currently disconnected from k8s api server, but will eventually receive the
166178 // resource. Other is that simply there is no primary resource present for an event, this
167- // might indicate issue with the implementation, but could happen also naturally, thus
179+ // might indicate an issue with the implementation, but could happen also naturally, thus
168180 // this is not necessarily a problem.
169181 log .debug ("no primary resource found in cache with resource id: {}" , resourceID );
170182 }
@@ -174,12 +186,25 @@ private void submitReconciliationExecution(ResourceState state) {
174186 }
175187 }
176188
177- private void handleEventMarking (Event event , ResourceState state ) {
189+ private Optional <P > getCachedResource (ResourceID resourceID , ResourceState <P > state ) {
190+ var resource = cache .get (resourceID );
191+ if (resource .isPresent ()) {
192+ return resource ;
193+ }
194+ if (controllerConfiguration .reconcileOnPrimaryDelete () && state .deleteEventPresent ()) {
195+ return Optional .of (state .getDeletedResource ());
196+ }
197+ return Optional .empty ();
198+ }
199+
200+ @ SuppressWarnings ("unchecked" )
201+ private void handleEventMarking (Event event , ResourceState <P > state ) {
178202 final var relatedCustomResourceID = event .getRelatedCustomResourceID ();
179203 if (event instanceof ResourceEvent resourceEvent ) {
180204 if (resourceEvent .getAction () == ResourceAction .DELETED ) {
181205 log .debug ("Marking delete event received for: {}" , relatedCustomResourceID );
182- state .markDeleteEventReceived ();
206+ // todo check can there be delete event without resource?
207+ state .markDeleteEventReceived ((P ) resourceEvent .getResource ().orElseThrow ());
183208 } else {
184209 if (state .processedMarkForDeletionPresent () && isResourceMarkedForDeletion (resourceEvent )) {
185210 log .debug (
@@ -196,6 +221,7 @@ private void handleEventMarking(Event event, ResourceState state) {
196221 // event as below.
197222 markEventReceived (state );
198223 }
224+ // todo this if is weird
199225 } else if (!state .deleteEventPresent () || !state .processedMarkForDeletionPresent ()) {
200226 markEventReceived (state );
201227 } else if (log .isDebugEnabled ()) {
@@ -207,7 +233,7 @@ private void handleEventMarking(Event event, ResourceState state) {
207233 }
208234 }
209235
210- private void markEventReceived (ResourceState state ) {
236+ private void markEventReceived (ResourceState < P > state ) {
211237 log .debug ("Marking event received for: {}" , state .getId ());
212238 state .markEventReceived ();
213239 }
@@ -251,7 +277,7 @@ synchronized void eventProcessingFinished(
251277 }
252278 cleanupOnSuccessfulExecution (executionScope );
253279 metrics .finishedReconciliation (executionScope .getResource (), metricsMetadata );
254- if (state .deleteEventPresent ()) {
280+ if (state .deleteEventPresent () || state . deleteEventReconciliationSubmitted () ) {
255281 cleanupForDeletedEvent (executionScope .getResourceID ());
256282 } else if (postExecutionControl .isFinalizerRemoved ()) {
257283 state .markProcessedMarkForDeletion ();
@@ -383,7 +409,7 @@ private void cleanupOnSuccessfulExecution(ExecutionScope<P> executionScope) {
383409 retryEventSource ().cancelOnceSchedule (executionScope .getResourceID ());
384410 }
385411
386- private ResourceState getOrInitRetryExecution (ExecutionScope <P > executionScope ) {
412+ private ResourceState < P > getOrInitRetryExecution (ExecutionScope <P > executionScope ) {
387413 final var state = resourceStateManager .getOrCreate (executionScope .getResourceID ());
388414 RetryExecution retryExecution = state .getRetry ();
389415 if (retryExecution == null ) {
@@ -399,7 +425,7 @@ private void cleanupForDeletedEvent(ResourceID resourceID) {
399425 metrics .cleanupDoneFor (resourceID , metricsMetadata );
400426 }
401427
402- private boolean isControllerUnderExecution (ResourceState state ) {
428+ private boolean isControllerUnderExecution (ResourceState < P > state ) {
403429 return state .isUnderProcessing ();
404430 }
405431
0 commit comments