|
54 | 54 | public class TemporaryResourceCache<T extends HasMetadata> { |
55 | 55 |
|
56 | 56 | private static final Logger log = LoggerFactory.getLogger(TemporaryResourceCache.class); |
| 57 | + public static final long DEFAULT_OBSOLETE_RESOURCE_CHECK_INTERVAL = 1000 * 60 * 3L; |
57 | 58 |
|
58 | 59 | private final Map<ResourceID, T> cache = new ConcurrentHashMap<>(); |
| 60 | + private final Map<ResourceID, EventFilterDetails> activeUpdates = new HashMap<>(); |
59 | 61 | private final boolean comparableResourceVersions; |
60 | 62 | private String latestResourceVersion; |
61 | 63 |
|
62 | | - private final Map<ResourceID, EventFilterDetails> activeUpdates = new HashMap<>(); |
| 64 | + private final long obsoleteResourceCheckInterval; |
| 65 | + private volatile long lastObsoleteResourceCheck = System.currentTimeMillis(); |
| 66 | + private ManagedInformerEventSource<T, ?, ?> managedInformerEventSource; |
63 | 67 |
|
64 | 68 | public enum EventHandling { |
65 | 69 | DEFER, |
66 | 70 | OBSOLETE, |
67 | 71 | NEW |
68 | 72 | } |
69 | 73 |
|
70 | | - public TemporaryResourceCache(boolean comparableResourceVersions) { |
| 74 | + public TemporaryResourceCache( |
| 75 | + boolean comparableResourceVersions, |
| 76 | + ManagedInformerEventSource<T, ?, ?> managedInformerEventSource) { |
| 77 | + this( |
| 78 | + comparableResourceVersions, |
| 79 | + DEFAULT_OBSOLETE_RESOURCE_CHECK_INTERVAL, |
| 80 | + managedInformerEventSource); |
| 81 | + } |
| 82 | + |
| 83 | + TemporaryResourceCache( |
| 84 | + boolean comparableResourceVersions, |
| 85 | + long obsoleteResourceCheckInterval, |
| 86 | + ManagedInformerEventSource<T, ?, ?> managedInformerEventSource) { |
71 | 87 | this.comparableResourceVersions = comparableResourceVersions; |
| 88 | + this.obsoleteResourceCheckInterval = obsoleteResourceCheckInterval; |
| 89 | + this.managedInformerEventSource = managedInformerEventSource; |
72 | 90 | } |
73 | 91 |
|
74 | 92 | public synchronized void startEventFilteringModify(ResourceID resourceID) { |
@@ -148,6 +166,7 @@ private synchronized EventHandling onEvent( |
148 | 166 | result = EventHandling.OBSOLETE; |
149 | 167 | } |
150 | 168 | } |
| 169 | + checkObsoleteResources(); |
151 | 170 | var ed = activeUpdates.get(resourceId); |
152 | 171 | if (ed != null && result != EventHandling.OBSOLETE) { |
153 | 172 | log.debug("Setting last event for id: {} delete: {}", resourceId, delete); |
@@ -208,6 +227,23 @@ public synchronized void putResource(T newResource) { |
208 | 227 | } |
209 | 228 | } |
210 | 229 |
|
| 230 | + void checkObsoleteResources() { |
| 231 | + if (System.currentTimeMillis() > lastObsoleteResourceCheck + obsoleteResourceCheckInterval) { |
| 232 | + lastObsoleteResourceCheck = System.currentTimeMillis(); |
| 233 | + log.debug("Checking for obsolete resources."); |
| 234 | + var iterator = cache.entrySet().iterator(); |
| 235 | + while (iterator.hasNext()) { |
| 236 | + var e = iterator.next(); |
| 237 | + if (ReconcilerUtilsInternal.compareResourceVersions( |
| 238 | + e.getValue().getMetadata().getResourceVersion(), latestResourceVersion) |
| 239 | + < 0) iterator.remove(); |
| 240 | + // todo propagate event |
| 241 | + managedInformerEventSource.handleEvent(ResourceAction.DELETED, e.getValue(), null, true); |
| 242 | + log.debug("Removing obsolete resource with ID: {}", e.getKey()); |
| 243 | + } |
| 244 | + } |
| 245 | + } |
| 246 | + |
211 | 247 | public synchronized Optional<T> getResourceFromCache(ResourceID resourceID) { |
212 | 248 | return Optional.ofNullable(cache.get(resourceID)); |
213 | 249 | } |
|
0 commit comments