1
1
package io .javaoperatorsdk .operator .processing .event ;
2
2
3
3
import java .time .Duration ;
4
- import java .util .HashMap ;
5
- import java .util .HashSet ;
6
- import java .util .Map ;
7
4
import java .util .Optional ;
8
- import java .util .Set ;
9
5
import java .util .concurrent .ExecutorService ;
10
6
import java .util .concurrent .ScheduledThreadPoolExecutor ;
11
7
22
18
import io .javaoperatorsdk .operator .processing .LifecycleAware ;
23
19
import io .javaoperatorsdk .operator .processing .MDCUtils ;
24
20
import io .javaoperatorsdk .operator .processing .event .rate .RateLimiter ;
21
+ import io .javaoperatorsdk .operator .processing .event .rate .RateLimiter .RateLimitState ;
25
22
import io .javaoperatorsdk .operator .processing .event .source .Cache ;
26
23
import io .javaoperatorsdk .operator .processing .event .source .controller .ResourceAction ;
27
24
import io .javaoperatorsdk .operator .processing .event .source .controller .ResourceEvent ;
@@ -37,17 +34,17 @@ class EventProcessor<R extends HasMetadata> implements EventHandler, LifecycleAw
37
34
private static final long MINIMAL_RATE_LIMIT_RESCHEDULE_DURATION = 50 ;
38
35
39
36
private volatile boolean running ;
40
- private final Set <ResourceID > underProcessing = new HashSet <>();
41
37
private final ReconciliationDispatcher <R > reconciliationDispatcher ;
42
38
private final Retry retry ;
43
- private final Map <ResourceID , RetryExecution > retryState = new HashMap <>();
44
39
private final ExecutorService executor ;
45
40
private final String controllerName ;
46
41
private final Metrics metrics ;
47
42
private final Cache <R > cache ;
48
43
private final EventSourceManager <R > eventSourceManager ;
49
44
private final EventMarker eventMarker = new EventMarker ();
50
- private final RateLimiter rateLimiter ;
45
+ private final RateLimiter <? extends RateLimitState > rateLimiter ;
46
+
47
+ private final ResourceStateManager resourceStateManager = new ResourceStateManager ();
51
48
52
49
EventProcessor (EventSourceManager <R > eventSourceManager ) {
53
50
this (
@@ -61,6 +58,7 @@ class EventProcessor<R extends HasMetadata> implements EventHandler, LifecycleAw
61
58
eventSourceManager );
62
59
}
63
60
61
+ @ SuppressWarnings ("rawtypes" )
64
62
EventProcessor (
65
63
ReconciliationDispatcher <R > reconciliationDispatcher ,
66
64
EventSourceManager <R > eventSourceManager ,
@@ -79,6 +77,7 @@ class EventProcessor<R extends HasMetadata> implements EventHandler, LifecycleAw
79
77
eventSourceManager );
80
78
}
81
79
80
+ @ SuppressWarnings ({"rawtypes" , "unchecked" })
82
81
private EventProcessor (
83
82
Cache <R > cache ,
84
83
ExecutorService executor ,
@@ -137,7 +136,13 @@ private void submitReconciliationExecution(ResourceID resourceID) {
137
136
Optional <R > latest = cache .get (resourceID );
138
137
latest .ifPresent (MDCUtils ::addResourceInfo );
139
138
if (!controllerUnderExecution && latest .isPresent ()) {
140
- var rateLimiterPermission = rateLimiter .acquirePermission (resourceID );
139
+ final var resourceState = resourceStateManager .getOrCreate (resourceID );
140
+ var rateLimit = resourceState .getRateLimit ();
141
+ if (rateLimit == null ) {
142
+ rateLimit = rateLimiter .initState ();
143
+ resourceState .setRateLimit (rateLimit );
144
+ }
145
+ var rateLimiterPermission = rateLimiter .isLimited (rateLimit );
141
146
if (rateLimiterPermission .isPresent ()) {
142
147
handleRateLimitedSubmission (resourceID , rateLimiterPermission .get ());
143
148
return ;
@@ -216,7 +221,7 @@ private void handleRateLimitedSubmission(ResourceID resourceID, Duration minimal
216
221
}
217
222
218
223
private RetryInfo retryInfo (ResourceID resourceID ) {
219
- return retryState . get (resourceID );
224
+ return resourceStateManager . getOrCreate (resourceID ). getRetry ( );
220
225
}
221
226
222
227
synchronized void eventProcessingFinished (
@@ -319,37 +324,38 @@ private void cleanupOnSuccessfulExecution(ExecutionScope<R> executionScope) {
319
324
log .debug (
320
325
"Cleanup for successful execution for resource: {}" , getName (executionScope .getResource ()));
321
326
if (isRetryConfigured ()) {
322
- retryState . remove (executionScope .getResourceID ());
327
+ resourceStateManager . getOrCreate (executionScope .getResourceID ()). setRetry ( null );
323
328
}
324
329
retryEventSource ().cancelOnceSchedule (executionScope .getResourceID ());
325
330
}
326
331
327
332
private RetryExecution getOrInitRetryExecution (ExecutionScope <R > executionScope ) {
328
- RetryExecution retryExecution = retryState .get (executionScope .getResourceID ());
333
+ final var state = resourceStateManager .getOrCreate (executionScope .getResourceID ());
334
+ RetryExecution retryExecution = state .getRetry ();
329
335
if (retryExecution == null ) {
330
336
retryExecution = retry .initExecution ();
331
- retryState . put ( executionScope . getResourceID (), retryExecution );
337
+ state . setRetry ( retryExecution );
332
338
}
333
339
return retryExecution ;
334
340
}
335
341
336
342
private void cleanupForDeletedEvent (ResourceID resourceID ) {
337
343
log .debug ("Cleaning up for delete event for: {}" , resourceID );
338
344
eventMarker .cleanup (resourceID );
339
- rateLimiter . clear (resourceID );
345
+ resourceStateManager . remove (resourceID );
340
346
metrics .cleanupDoneFor (resourceID );
341
347
}
342
348
343
349
private boolean isControllerUnderExecution (ResourceID resourceID ) {
344
- return underProcessing . contains (resourceID );
350
+ return resourceStateManager . getOrCreate (resourceID ). isUnderProcessing ( );
345
351
}
346
352
347
353
private void setUnderExecutionProcessing (ResourceID resourceID ) {
348
- underProcessing . add (resourceID );
354
+ resourceStateManager . getOrCreate (resourceID ). setUnderProcessing ( true );
349
355
}
350
356
351
357
private void unsetUnderExecution (ResourceID resourceID ) {
352
- underProcessing . remove (resourceID );
358
+ resourceStateManager . getOrCreate (resourceID ). setUnderProcessing ( false );
353
359
}
354
360
355
361
private boolean isRetryConfigured () {
@@ -405,6 +411,6 @@ public String toString() {
405
411
}
406
412
407
413
public synchronized boolean isUnderProcessing (ResourceID resourceID ) {
408
- return underProcessing . contains (resourceID );
414
+ return isControllerUnderExecution (resourceID );
409
415
}
410
416
}
0 commit comments