Skip to content

Commit d9b90ed

Browse files
committed
fix: extremely rare race condition when getting the resource from cache - alt 1
Signed-off-by: Attila Mészáros <a_meszaros@apple.com>
1 parent 2c7ba27 commit d9b90ed

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

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

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,28 @@ public Optional<R> get(ResourceID resourceID) {
194194
// The order of reading from these caches matters
195195
Optional<R> resource = temporaryResourceCache.getResourceFromCache(resourceID);
196196
var res = cache.get(resourceID);
197-
if (comparableResourceVersions
198-
&& resource.isPresent()
199-
&& (res.isEmpty()
200-
|| ReconcilerUtilsInternal.compareResourceVersions(
201-
resource.get().getMetadata().getResourceVersion(),
202-
res.get().getMetadata().getResourceVersion())
203-
> 0)) {
204-
log.debug("Latest resource found in temporary cache for Resource ID: {}", resourceID);
205-
return resource;
197+
if (comparableResourceVersions && resource.isPresent()) {
198+
var comp =
199+
ReconcilerUtilsInternal.compareResourceVersions(
200+
resource.get().getMetadata().getResourceVersion(),
201+
manager().lastSyncResourceVersion(resource.get().getMetadata().getNamespace()));
202+
if (comp > 0) {
203+
log.debug("Latest resource found in temporary cache for Resource ID: {}", resourceID);
204+
return resource;
205+
} else {
206+
log.debug(
207+
"Latest resource not found in temporary but was obsolete: {}. Re-reading the informer"
208+
+ " cache: {}",
209+
resourceID,
210+
res.isEmpty());
211+
if (res.isEmpty()) {
212+
// re-reading resource from informer cache since an add even might have received
213+
// after the first read.
214+
return cache.get(resourceID);
215+
} else {
216+
return res;
217+
}
218+
}
206219
}
207220
log.debug(
208221
"Resource found in temp cache: {}, or older, in temporary cache. Found in informer cache"

0 commit comments

Comments
 (0)