Skip to content

Commit 08647db

Browse files
committed
wip
Signed-off-by: Attila Mészáros <a_meszaros@apple.com>
1 parent 8022d1c commit 08647db

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/EventFilterDetails.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616
package io.javaoperatorsdk.operator.processing.event.source.informer;
1717

1818
import java.util.Optional;
19+
import java.util.function.UnaryOperator;
1920

21+
import io.fabric8.kubernetes.api.model.HasMetadata;
2022
import io.javaoperatorsdk.operator.ReconcilerUtilsInternal;
2123
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEvent;
2224

2325
class EventFilterDetails {
2426

2527
private int activeUpdates = 0;
2628
private ResourceEvent lastEvent;
29+
private String lastOwnUpdatedResourceVersion;
2730

2831
public void increaseActiveUpdates() {
2932
activeUpdates = activeUpdates + 1;
@@ -38,12 +41,29 @@ public void setLastEvent(ResourceEvent event) {
3841
lastEvent = event;
3942
}
4043

41-
public Optional<ResourceEvent> getLatestEventAfterLastUpdateEvent(String updatedResourceVersion) {
44+
/**
45+
* This is needed for case when multiple parallel updates happening inside the controller to
46+
* prevent race condition and send event from {@link
47+
* ManagedInformerEventSource#eventFilteringUpdateAndCacheResource(HasMetadata, UnaryOperator)}
48+
*/
49+
public void handleLastOwnUpdatedResourceVersion(String resourceVersion) {
50+
if (resourceVersion == null) {
51+
return;
52+
}
53+
if (lastOwnUpdatedResourceVersion == null
54+
|| ReconcilerUtilsInternal.compareResourceVersions(
55+
resourceVersion, lastOwnUpdatedResourceVersion)
56+
> 0) {
57+
lastOwnUpdatedResourceVersion = resourceVersion;
58+
}
59+
}
60+
61+
public Optional<ResourceEvent> getLatestEventAfterLastUpdateEvent() {
4262
if (lastEvent != null
43-
&& (updatedResourceVersion == null
63+
&& (lastOwnUpdatedResourceVersion == null
4464
|| ReconcilerUtilsInternal.compareResourceVersions(
4565
lastEvent.getResource().orElseThrow().getMetadata().getResourceVersion(),
46-
updatedResourceVersion)
66+
lastOwnUpdatedResourceVersion)
4767
> 0)) {
4868
return Optional.of(lastEvent);
4969
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/TemporaryResourceCache.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,10 @@ public synchronized Optional<ResourceEvent> doneEventFilterModify(
8585
return Optional.empty();
8686
}
8787
var ed = activeUpdates.get(resourceID);
88+
ed.handleLastOwnUpdatedResourceVersion(updatedResourceVersion);
8889
if (ed.decreaseActiveUpdates()) {
8990
activeUpdates.remove(resourceID);
90-
var res = ed.getLatestEventAfterLastUpdateEvent(updatedResourceVersion);
91+
var res = ed.getLatestEventAfterLastUpdateEvent();
9192
log.debug(
9293
"Zero active updates for resource id: {}; event after update event: {}; updated resource"
9394
+ " version: {}",

0 commit comments

Comments
 (0)