Skip to content

Commit 7fb3f99

Browse files
author
Alexander Idelberger
committed
Refactor CustomResourceCache
* Remove the need of a lock * clone doesn't need to handle null anymore
1 parent 3747611 commit 7fb3f99

File tree

1 file changed

+20
-32
lines changed

1 file changed

+20
-32
lines changed

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

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,46 +3,38 @@
33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import io.fabric8.kubernetes.client.CustomResource;
6-
import java.util.Map;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
79
import java.util.Optional;
810
import java.util.concurrent.ConcurrentHashMap;
9-
import java.util.concurrent.locks.Lock;
10-
import java.util.concurrent.locks.ReentrantLock;
11+
import java.util.concurrent.ConcurrentMap;
1112
import java.util.function.Predicate;
12-
import org.slf4j.Logger;
13-
import org.slf4j.LoggerFactory;
1413

14+
@SuppressWarnings("rawtypes")
1515
public class CustomResourceCache {
1616

1717
private static final Logger log = LoggerFactory.getLogger(CustomResourceCache.class);
1818

1919
private final ObjectMapper objectMapper;
20-
private final Map<String, CustomResource> resources = new ConcurrentHashMap<>();
21-
private final Lock lock = new ReentrantLock();
20+
private final ConcurrentMap<String, CustomResource> resources = new ConcurrentHashMap<>();
2221

2322
public CustomResourceCache(ObjectMapper objectMapper) {
2423
this.objectMapper = objectMapper;
2524
}
2625

2726
public void cacheResource(CustomResource resource) {
28-
try {
29-
lock.lock();
30-
resources.put(KubernetesResourceUtils.getUID(resource), resource);
31-
} finally {
32-
lock.unlock();
33-
}
27+
resources.put(KubernetesResourceUtils.getUID(resource), resource);
3428
}
3529

3630
public void cacheResource(CustomResource resource, Predicate<CustomResource> predicate) {
37-
try {
38-
lock.lock();
39-
if (predicate.test(resources.get(KubernetesResourceUtils.getUID(resource)))) {
40-
log.trace("Update cache after condition is true: {}", resource);
41-
resources.put(resource.getMetadata().getUid(), resource);
31+
resources.compute(KubernetesResourceUtils.getUID(resource), (id, prev) -> {
32+
if (predicate.test(prev)) {
33+
log.trace("Attempting to update cache after condition is true: {}", resource);
34+
return resource;
4235
}
43-
} finally {
44-
lock.unlock();
45-
}
36+
return prev;
37+
});
4638
}
4739

4840
/**
@@ -53,24 +45,20 @@ public void cacheResource(CustomResource resource, Predicate<CustomResource> pre
5345
* @return
5446
*/
5547
public Optional<CustomResource> getLatestResource(String uuid) {
56-
return Optional.ofNullable(clone(resources.get(uuid)));
48+
return Optional.ofNullable(resources.get(uuid))
49+
.map(this::clone);
50+
}
51+
52+
public CustomResource cleanup(String customResourceUid) {
53+
return resources.remove(customResourceUid);
5754
}
5855

5956
private CustomResource clone(CustomResource customResource) {
6057
try {
61-
if (customResource == null) {
62-
return null;
63-
}
64-
CustomResource clonedObject =
65-
objectMapper.readValue(
58+
return objectMapper.readValue(
6659
objectMapper.writeValueAsString(customResource), customResource.getClass());
67-
return clonedObject;
6860
} catch (JsonProcessingException e) {
6961
throw new IllegalStateException(e);
7062
}
7163
}
72-
73-
public CustomResource cleanup(String customResourceUid) {
74-
return resources.remove(customResourceUid);
75-
}
7664
}

0 commit comments

Comments
 (0)