Skip to content

Commit 9bc9ff1

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

File tree

4 files changed

+53
-15
lines changed

4 files changed

+53
-15
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,25 +83,34 @@ public void changeNamespaces(Set<String> namespaces) {
8383
}
8484
}
8585

86+
/**
87+
* Updates the resource and makes sure that the response is available for the next reconciliation.
88+
* It does not filter the event produced by this update.
89+
*/
8690
public R updateAndCacheResource(R resourceToUpdate, UnaryOperator<R> updateMethod) {
8791
ResourceID id = ResourceID.fromResource(resourceToUpdate);
8892
var updated = updateMethod.apply(resourceToUpdate);
8993
handleRecentResourceUpdate(id, updated, resourceToUpdate);
9094
return updated;
9195
}
9296

97+
/**
98+
* Updates the resource and makes sure that the response is available for the next reconciliation.
99+
* Also makes sure that the even produced by this update is filtered, thus does not trigger the
100+
* reconciliation.
101+
*/
93102
public R eventFilteringUpdateAndCacheResource(R resourceToUpdate, UnaryOperator<R> updateMethod) {
94103
ResourceID id = ResourceID.fromResource(resourceToUpdate);
95104
if (log.isDebugEnabled()) {
96105
log.debug("Update and cache: {}", id);
97106
}
98107
try {
99-
temporaryResourceCache.startEventFilterModifying(id);
108+
temporaryResourceCache.startEventFilteringModify(id);
100109
var updated = updateMethod.apply(resourceToUpdate);
101110
handleRecentResourceUpdate(id, updated, resourceToUpdate);
102111
return updated;
103112
} finally {
104-
temporaryResourceCache.doneEventFilterModifying(id);
113+
temporaryResourceCache.doneEventFilterModify(id);
105114
}
106115
}
107116

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public TemporaryResourceCache(boolean comparableResourceVersions) {
6363
this.comparableResourceVersions = comparableResourceVersions;
6464
}
6565

66-
public void startEventFilterModifying(ResourceID id) {
66+
public void startEventFilteringModify(ResourceID id) {
6767
if (!comparableResourceVersions) {
6868
return;
6969
}
@@ -80,7 +80,7 @@ public void startEventFilterModifying(ResourceID id) {
8080
.lock();
8181
}
8282

83-
public void doneEventFilterModifying(ResourceID id) {
83+
public void doneEventFilterModify(ResourceID id) {
8484
if (!comparableResourceVersions) {
8585
return;
8686
}
@@ -97,7 +97,7 @@ public void onDeleteEvent(T resource, boolean unknownState) {
9797
}
9898

9999
/**
100-
* @return true if the resourceVersion was already known
100+
* @return true if the resourceVersion was already known and not skipped for event filtering
101101
*/
102102
public boolean onAddOrUpdateEvent(T resource) {
103103
return onEvent(resource, false);
@@ -131,8 +131,10 @@ private boolean onEvent(T resource, boolean unknownState) {
131131
}
132132
if (comp < 0) {
133133
filter[0] = true;
134+
} else if (comp == 0) {
135+
filter[0] = !skipFiltering.remove(resourceId);
134136
} else {
135-
filter[0] = skipFiltering.remove(resourceId);
137+
skipFiltering.remove(resourceId);
136138
}
137139
}
138140
if (remove) {

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/informer/TemporaryPrimaryResourceCacheTest.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,15 @@ void nonComparableResourceVersionsDisables() {
122122
void lockedEventBeforePut() throws Exception {
123123
var testResource = testResource();
124124

125-
temporaryResourceCache.startEventFilterModifying(ResourceID.fromResource(testResource));
125+
temporaryResourceCache.startEventFilteringModify(ResourceID.fromResource(testResource));
126126

127127
ExecutorService ex = Executors.newSingleThreadExecutor();
128128
try {
129129
var result = ex.submit(() -> temporaryResourceCache.onAddOrUpdateEvent(testResource));
130130

131131
temporaryResourceCache.putResource(testResource);
132132
assertThat(result.isDone()).isFalse();
133-
temporaryResourceCache.doneEventFilterModifying(ResourceID.fromResource(testResource));
133+
temporaryResourceCache.doneEventFilterModify(ResourceID.fromResource(testResource));
134134
assertThat(result.get(10, TimeUnit.SECONDS)).isTrue();
135135
} finally {
136136
ex.shutdownNow();
@@ -149,7 +149,28 @@ void putBeforeEvent() {
149149
nextResource.getMetadata().setResourceVersion("3");
150150
temporaryResourceCache.putResource(nextResource);
151151

152-
// now expect an event with the matching resourceVersion to be known after the put
152+
// the result is false since the put was not part of event filtering update
153+
result = temporaryResourceCache.onAddOrUpdateEvent(nextResource);
154+
assertThat(result).isFalse();
155+
}
156+
157+
@Test
158+
void putBeforeEventWithEventFiltering() {
159+
var testResource = testResource();
160+
161+
// first ensure an event is not known
162+
var result = temporaryResourceCache.onAddOrUpdateEvent(testResource);
163+
assertThat(result).isFalse();
164+
165+
var nextResource = testResource();
166+
nextResource.getMetadata().setResourceVersion("3");
167+
var resourceId = ResourceID.fromResource(testResource);
168+
169+
temporaryResourceCache.startEventFilteringModify(resourceId);
170+
temporaryResourceCache.putResource(nextResource);
171+
temporaryResourceCache.doneEventFilterModify(resourceId);
172+
173+
// the result is false since the put was not part of event filtering update
153174
result = temporaryResourceCache.onAddOrUpdateEvent(nextResource);
154175
assertThat(result).isTrue();
155176
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/ssaissue/specupdate/SSASpecUpdateReconciler.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package io.javaoperatorsdk.operator.baseapi.ssaissue.specupdate;
1717

18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
20+
1821
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
1922
import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
2023
import io.javaoperatorsdk.operator.api.reconciler.Context;
@@ -27,18 +30,21 @@
2730
public class SSASpecUpdateReconciler
2831
implements Reconciler<SSASpecUpdateCustomResource>, Cleaner<SSASpecUpdateCustomResource> {
2932

33+
private static final Logger log = LoggerFactory.getLogger(SSASpecUpdateReconciler.class);
34+
3035
@Override
3136
public UpdateControl<SSASpecUpdateCustomResource> reconcile(
3237
SSASpecUpdateCustomResource resource, Context<SSASpecUpdateCustomResource> context) {
3338

3439
var copy = createFreshCopy(resource);
3540
copy.getSpec().setValue("value");
36-
context
37-
.getClient()
38-
.resource(copy)
39-
.fieldManager(context.getControllerConfiguration().fieldManager())
40-
.serverSideApply();
41-
41+
var res =
42+
context
43+
.getClient()
44+
.resource(copy)
45+
.fieldManager(context.getControllerConfiguration().fieldManager())
46+
.serverSideApply();
47+
log.info("res: {}", res);
4248
return UpdateControl.noUpdate();
4349
}
4450

0 commit comments

Comments
 (0)