Skip to content

Commit e534119

Browse files
committed
enabling parse versions by default
aligning more Signed-off-by: Steve Hawkins <shawkins@redhat.com>
1 parent 2902bff commit e534119

File tree

8 files changed

+55
-33
lines changed

8 files changed

+55
-33
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -491,18 +491,16 @@ default Set<Class<? extends HasMetadata>> withPreviousAnnotationForDependentReso
491491

492492
/**
493493
* If the event logic should parse the resourceVersion to determine the ordering of dependent
494-
* resource events. This is typically not needed.
494+
* resource events.
495495
*
496-
* <p>Disabled by default as Kubernetes does not support, and discourages, this interpretation of
497-
* resourceVersions. Enable only if your api server event processing seems to lag the operator
498-
* logic, and you want to further minimize the amount of work done / updates issued by the
499-
* operator.
496+
* <p>Enabled by default as Kubernetes does support this interpretation of resourceVersions.
497+
* Disable only if your api server provides non comparable resource versions..
500498
*
501499
* @return if resource version should be parsed (as integer)
502500
* @since 4.5.0
503501
*/
504502
default boolean parseResourceVersionsForEventFilteringAndCaching() {
505-
return false;
503+
return true;
506504
}
507505

508506
/**

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/PrimaryUpdateAndCacheUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,11 @@ public static <P extends HasMetadata> P addFinalizerWithSSA(
451451
}
452452
}
453453

454+
public static int compareResourceVersions(HasMetadata h1, HasMetadata h2) {
455+
return compareResourceVersions(
456+
h1.getMetadata().getResourceVersion(), h2.getMetadata().getResourceVersion());
457+
}
458+
454459
public static int compareResourceVersions(String v1, String v2) {
455460
var v1Length = v1.length();
456461
if (v1Length == 0) {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/controller/ControllerEventSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class ControllerEventSource<T extends HasMetadata>
4747

4848
@SuppressWarnings({"unchecked", "rawtypes"})
4949
public ControllerEventSource(Controller<T> controller) {
50-
super(NAME, controller.getCRClient(), controller.getConfiguration(), false);
50+
super(NAME, controller.getCRClient(), controller.getConfiguration(), true);
5151
this.controller = controller;
5252

5353
final var config = controller.getConfiguration();

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

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public InformerEventSource(
9292
}
9393

9494
InformerEventSource(InformerEventSourceConfiguration<R> configuration, KubernetesClient client) {
95-
this(configuration, client, false);
95+
this(configuration, client, true);
9696
}
9797

9898
@SuppressWarnings({"unchecked", "rawtypes"})
@@ -207,21 +207,8 @@ private synchronized void onAddOrUpdate(
207207
}
208208

209209
private boolean canSkipEvent(R newObject, R oldObject, ResourceID resourceID) {
210-
var res = temporaryResourceCache.getResourceFromCache(resourceID);
211-
if (res.isEmpty()) {
212-
return isEventKnownFromAnnotation(newObject, oldObject);
213-
}
214-
boolean resVersionsEqual =
215-
newObject
216-
.getMetadata()
217-
.getResourceVersion()
218-
.equals(res.get().getMetadata().getResourceVersion());
219-
log.debug(
220-
"Resource found in temporal cache for id: {} resource versions equal: {}",
221-
resourceID,
222-
resVersionsEqual);
223-
return resVersionsEqual
224-
|| temporaryResourceCache.isLaterResourceVersion(resourceID, res.get(), newObject);
210+
return temporaryResourceCache.canSkipEvent(resourceID, newObject)
211+
|| isEventKnownFromAnnotation(newObject, oldObject);
225212
}
226213

227214
private boolean isEventKnownFromAnnotation(R newObject, R oldObject) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ public Optional<R> get(ResourceID resourceID) {
221221
: r);
222222
}
223223

224+
public Optional<String> getLastSyncResourceVersion(Optional<String> namespace) {
225+
return getSource(namespace.orElse(WATCH_ALL_NAMESPACES))
226+
.map(source -> source.getLastSyncResourceVersion());
227+
}
228+
224229
@Override
225230
public Stream<ResourceID> keys() {
226231
return sources.values().stream().flatMap(Cache::keys);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ public Optional<T> get(ResourceID resourceID) {
156156
return Optional.ofNullable(cache.getByKey(getKey(resourceID)));
157157
}
158158

159+
public String getLastSyncResourceVersion() {
160+
return this.informer.lastSyncResourceVersion();
161+
}
162+
159163
private String getKey(ResourceID resourceID) {
160164
return Cache.namespaceKeyFunc(resourceID.getNamespace().orElse(null), resourceID.getName());
161165
}

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

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
3535
import io.javaoperatorsdk.operator.api.config.Informable;
3636
import io.javaoperatorsdk.operator.api.config.NamespaceChangeable;
37+
import io.javaoperatorsdk.operator.api.reconciler.PrimaryUpdateAndCacheUtils;
3738
import io.javaoperatorsdk.operator.api.reconciler.dependent.RecentOperationCacheFiller;
3839
import io.javaoperatorsdk.operator.health.InformerHealthIndicator;
3940
import io.javaoperatorsdk.operator.health.InformerWrappingEventSourceHealthIndicator;
@@ -133,19 +134,28 @@ public void handleRecentResourceCreate(ResourceID resourceID, R resource) {
133134

134135
@Override
135136
public Optional<R> get(ResourceID resourceID) {
137+
var res = cache.get(resourceID);
136138
Optional<R> resource = temporaryResourceCache.getResourceFromCache(resourceID);
137-
if (resource.isPresent()) {
138-
log.debug("Resource found in temporary cache for Resource ID: {}", resourceID);
139+
if (parseResourceVersions
140+
&& resource.isPresent()
141+
&& res.filter(
142+
r ->
143+
PrimaryUpdateAndCacheUtils.compareResourceVersions(r, resource.orElseThrow())
144+
> 0)
145+
.isEmpty()) {
146+
log.debug("Latest resource found in temporary cache for Resource ID: {}", resourceID);
139147
return resource;
140-
} else {
141-
log.debug(
142-
"Resource not found in temporary cache reading it from informer cache,"
143-
+ " for Resource ID: {}",
144-
resourceID);
145-
var res = cache.get(resourceID);
146-
log.debug("Resource found in cache: {} for id: {}", res.isPresent(), resourceID);
147-
return res;
148148
}
149+
log.debug(
150+
"Resource not found, or older, in temporary cache. Found in informer cache {}, for"
151+
+ " Resource ID: {}",
152+
res.isPresent(),
153+
resourceID);
154+
return res;
155+
}
156+
157+
public Optional<String> getLastSyncResourceVersion(Optional<String> namespace) {
158+
return cache.getLastSyncResourceVersion(namespace);
149159
}
150160

151161
@SuppressWarnings("unused")

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import io.fabric8.kubernetes.api.model.HasMetadata;
2727
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
28+
import io.javaoperatorsdk.operator.api.reconciler.PrimaryUpdateAndCacheUtils;
2829
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
2930
import io.javaoperatorsdk.operator.processing.event.ResourceID;
3031

@@ -130,6 +131,10 @@ public synchronized void putAddedResource(T newResource) {
130131
* @param previousResourceVersion null indicates an add
131132
*/
132133
public synchronized void putResource(T newResource, String previousResourceVersion) {
134+
if (!parseResourceVersions) {
135+
return;
136+
}
137+
133138
var resourceId = ResourceID.fromResource(newResource);
134139
var cachedResource = managedInformerEventSource.get(resourceId).orElse(null);
135140

@@ -185,6 +190,14 @@ public boolean isLaterResourceVersion(ResourceID resourceId, T newResource, T ca
185190
}
186191
return false;
187192
}
193+
194+
public boolean canSkipEvent(ResourceID resourceID, T resource) {
195+
return parseResourceVersions
196+
&& getResourceFromCache(resourceID)
197+
.filter(
198+
cached -> PrimaryUpdateAndCacheUtils.compareResourceVersions(cached, resource) >= 0)
199+
.isPresent();
200+
}
188201

189202
public synchronized Optional<T> getResourceFromCache(ResourceID resourceID) {
190203
return Optional.ofNullable(cache.get(resourceID));

0 commit comments

Comments
 (0)