Skip to content

Commit bd329e7

Browse files
committed
wip
Signed-off-by: Attila Mészáros <[email protected]>
1 parent ebcbce1 commit bd329e7

File tree

5 files changed

+44
-13
lines changed

5 files changed

+44
-13
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,4 +486,8 @@ public boolean workflowContainsDependentForType(Class<?> clazz) {
486486
return managedWorkflow.getDependentResourcesByName().values().stream()
487487
.anyMatch(d -> d.resourceType().equals(clazz));
488488
}
489+
490+
public boolean isCleaner() {
491+
return isCleaner;
492+
}
489493
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ private void submitReconciliationExecution(ResourceState state) {
150150
state.setUnderProcessing(true);
151151
final var latest = maybeLatest.get();
152152
ExecutionScope<P> executionScope = new ExecutionScope<>(state.getRetry());
153-
state.unMarkEventReceived();
153+
state.unMarkEventReceived(controllerConfiguration.isAllEventReconcileMode());
154154
metrics.reconcileCustomResource(latest, state.getRetry(), metricsMetadata);
155155
log.debug("Executing events for custom resource. Scope: {}", executionScope);
156156
executor.execute(new ReconcilerExecutor(resourceID, executionScope));
@@ -197,10 +197,12 @@ private void handleEventMarking(Event event, ResourceState state) {
197197
// removed, but also the informers websocket is disconnected and later reconnected. So
198198
// meanwhile the resource could be deleted and recreated. In this case we just mark a new
199199
// event as below.
200-
markEventReceived(state);
200+
state.markEventReceived();
201201
}
202202
} else if (!state.deleteEventPresent() && !state.processedMarkForDeletionPresent()) {
203-
markEventReceived(state);
203+
state.markEventReceived();
204+
} else if (controllerConfiguration.isAllEventReconcileMode() && state.deleteEventPresent()) {
205+
state.markAdditionalEventAfterDeleteEvent();
204206
} else if (log.isDebugEnabled()) {
205207
log.debug(
206208
"Skipped marking event as received. Delete event present: {}, processed mark for"
@@ -210,11 +212,6 @@ private void handleEventMarking(Event event, ResourceState state) {
210212
}
211213
}
212214

213-
private void markEventReceived(ResourceState state) {
214-
log.debug("Marking event received for: {}", state.getId());
215-
state.markEventReceived();
216-
}
217-
218215
private boolean isResourceMarkedForDeletion(ResourceEvent resourceEvent) {
219216
return resourceEvent.getResource().map(HasMetadata::isMarkedForDeletion).orElse(false);
220217
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcher.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ && shouldNotDispatchToCleanupWhenMarkedForDeletion(originalResource)) {
9898
resourceForExecution,
9999
executionScope.isDeleteEvent(),
100100
executionScope.isDeleteFinalStateUnknown());
101-
if (markedForDeletion && !configuration().isAllEventReconcileMode()) {
101+
102+
// checking the cleaner for all-event-mode
103+
if (markedForDeletion && controller.isCleaner()) {
102104
return handleCleanup(resourceForExecution, originalResource, context);
103105
} else {
104106
return handleReconcile(executionScope, resourceForExecution, originalResource, context);

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceState.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package io.javaoperatorsdk.operator.processing.event;
22

3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
36
import io.fabric8.kubernetes.api.model.HasMetadata;
47
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter.RateLimitState;
58
import io.javaoperatorsdk.operator.processing.retry.RetryExecution;
69

710
class ResourceState {
811

12+
private static final Logger log = LoggerFactory.getLogger(ResourceState.class);
13+
914
/**
1015
* Manages the state of received events. Basically there can be only three distinct states
1116
* relevant for event processing. Either an event is received, so we eventually process or no
@@ -76,7 +81,8 @@ public void markDeleteEventReceived(
7681
}
7782

7883
public boolean deleteEventPresent() {
79-
return eventing == EventingState.DELETE_EVENT_PRESENT;
84+
return eventing == EventingState.DELETE_EVENT_PRESENT
85+
|| eventing == EventingState.ADDITIONAL_EVENT_PRESENT_AFTER_DELETE_EVENT;
8086
}
8187

8288
public boolean processedMarkForDeletionPresent() {
@@ -87,10 +93,22 @@ public void markEventReceived() {
8793
if (deleteEventPresent()) {
8894
throw new IllegalStateException("Cannot receive event after a delete event received");
8995
}
96+
log.debug("Marking event received for: {}", getId());
9097
eventing = EventingState.EVENT_PRESENT;
9198
}
9299

100+
public void markAdditionalEventAfterDeleteEvent() {
101+
if (!deleteEventPresent()) {
102+
throw new IllegalStateException(
103+
"Cannot mark additional event after delete event, if in current state not delete event"
104+
+ " present");
105+
}
106+
log.debug("Marking additional event after delete event: {}", getId());
107+
eventing = EventingState.ADDITIONAL_EVENT_PRESENT_AFTER_DELETE_EVENT;
108+
}
109+
93110
public void markProcessedMarkForDeletion() {
111+
log.debug("Marking processed mark for deletion: {}", getId());
94112
eventing = EventingState.PROCESSED_MARK_FOR_DELETION;
95113
}
96114

@@ -110,15 +128,25 @@ public HasMetadata getLastKnownResource() {
110128
return lastKnownResource;
111129
}
112130

113-
public void unMarkEventReceived() {
131+
public void unMarkEventReceived(boolean isAllEventReconcileMode) {
114132
switch (eventing) {
115133
case EVENT_PRESENT:
116134
eventing = EventingState.NO_EVENT_PRESENT;
117135
break;
118136
case PROCESSED_MARK_FOR_DELETION:
119137
throw new IllegalStateException("Cannot unmark processed marked for deletion.");
120138
case DELETE_EVENT_PRESENT:
121-
throw new IllegalStateException("Cannot unmark delete event.");
139+
if (!isAllEventReconcileMode) {
140+
throw new IllegalStateException("Cannot unmark delete event.");
141+
}
142+
break;
143+
case ADDITIONAL_EVENT_PRESENT_AFTER_DELETE_EVENT:
144+
if (!isAllEventReconcileMode) {
145+
throw new IllegalStateException(
146+
"This state should not happen in non all-event-reconciliation mode");
147+
}
148+
eventing = EventingState.DELETE_EVENT_PRESENT;
149+
break;
122150
case NO_EVENT_PRESENT:
123151
// do nothing
124152
break;

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/ResourceStateManagerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public void cannotMarkEventAfterDeleteEventReceived() {
8282
public void listsResourceIDSWithEventsPresent() {
8383
state.markEventReceived();
8484
state2.markEventReceived();
85-
state.unMarkEventReceived();
85+
state.unMarkEventReceived(false);
8686

8787
var res = manager.resourcesWithEventPresent();
8888

0 commit comments

Comments
 (0)