5
5
import java .util .Objects ;
6
6
import java .util .Optional ;
7
7
import java .util .concurrent .ConcurrentHashMap ;
8
+ import java .util .function .Predicate ;
9
+ import java .util .stream .Stream ;
8
10
9
11
import org .slf4j .Logger ;
10
12
import org .slf4j .LoggerFactory ;
22
24
import io .javaoperatorsdk .operator .processing .MDCUtils ;
23
25
import io .javaoperatorsdk .operator .processing .event .ResourceID ;
24
26
import io .javaoperatorsdk .operator .processing .event .source .AbstractResourceEventSource ;
27
+ import io .javaoperatorsdk .operator .processing .event .source .ResourceCache ;
25
28
26
29
import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getName ;
27
30
import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getUID ;
28
31
import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getVersion ;
29
32
30
33
public class ControllerResourceEventSource <T extends HasMetadata >
31
34
extends AbstractResourceEventSource <T , T >
32
- implements ResourceEventHandler <T > {
35
+ implements ResourceEventHandler <T >, ResourceCache < T > {
33
36
34
37
public static final String ANY_NAMESPACE_MAP_KEY = "anyNamespace" ;
35
38
@@ -40,8 +43,8 @@ public class ControllerResourceEventSource<T extends HasMetadata>
40
43
new ConcurrentHashMap <>();
41
44
42
45
private final ResourceEventFilter <T > filter ;
43
- private final OnceWhitelistEventFilterEventFilter <T > onceWhitelistEventFilterEventFilter ;
44
46
private final ControllerResourceCache <T > cache ;
47
+ private final TemporaryResourceCache <T > temporaryResourceCache ;
45
48
46
49
public ControllerResourceEventSource (Controller <T > controller ) {
47
50
super (controller .getConfiguration ().getResourceClass ());
@@ -50,20 +53,12 @@ public ControllerResourceEventSource(Controller<T> controller) {
50
53
var cloner = configurationService != null ? configurationService .getResourceCloner ()
51
54
: ConfigurationService .DEFAULT_CLONER ;
52
55
this .cache = new ControllerResourceCache <>(sharedIndexInformers , cloner );
53
-
56
+ temporaryResourceCache = new TemporaryResourceCache <>( cache );
54
57
var filters = new ResourceEventFilter [] {
55
58
ResourceEventFilters .finalizerNeededAndApplied (),
56
59
ResourceEventFilters .markedForDeletion (),
57
- ResourceEventFilters .generationAware (),
58
- null
60
+ ResourceEventFilters .generationAware ()
59
61
};
60
-
61
- if (controller .getConfiguration ().isGenerationAware ()) {
62
- onceWhitelistEventFilterEventFilter = new OnceWhitelistEventFilterEventFilter <>();
63
- filters [filters .length - 1 ] = onceWhitelistEventFilterEventFilter ;
64
- } else {
65
- onceWhitelistEventFilterEventFilter = null ;
66
- }
67
62
if (controller .getConfiguration ().getEventFilter () != null ) {
68
63
filter = controller .getConfiguration ().getEventFilter ().and (ResourceEventFilters .or (filters ));
69
64
} else {
@@ -126,6 +121,7 @@ public void eventReceived(ResourceAction action, T customResource, T oldResource
126
121
try {
127
122
log .debug (
128
123
"Event received for resource: {}" , getName (customResource ));
124
+ temporaryResourceCache .removeResourceFromCache (customResource );
129
125
MDCUtils .addResourceInfo (customResource );
130
126
controller .getEventSourceManager ().broadcastOnResourceEvent (action , customResource ,
131
127
oldResource );
@@ -158,12 +154,31 @@ public void onDelete(T resource, boolean b) {
158
154
eventReceived (ResourceAction .DELETED , resource , null );
159
155
}
160
156
157
+
158
+ @ Override
161
159
public Optional <T > get (ResourceID resourceID ) {
162
- return cache .get (resourceID );
160
+ Optional <T > resource = temporaryResourceCache .getResourceFromCache (resourceID );
161
+ if (resource .isPresent ()) {
162
+ log .debug ("Resource found in temporal cache for Resource ID: {}" , resourceID );
163
+ return resource ;
164
+ } else {
165
+ return cache .get (resourceID );
166
+ }
167
+ }
168
+
169
+ @ Override
170
+ public Stream <ResourceID > keys () {
171
+ return cache .keys ();
172
+ }
173
+
174
+ @ Override
175
+ public Stream <T > list (Predicate <T > predicate ) {
176
+ return cache .list (predicate );
163
177
}
164
178
165
- public ControllerResourceCache <T > getResourceCache () {
166
- return cache ;
179
+ @ Override
180
+ public Stream <T > list (String namespace , Predicate <T > predicate ) {
181
+ return cache .list (namespace , predicate );
167
182
}
168
183
169
184
/**
@@ -178,19 +193,6 @@ public SharedIndexInformer<T> getInformer(String namespace) {
178
193
return getInformers ().get (Objects .requireNonNullElse (namespace , ANY_NAMESPACE_MAP_KEY ));
179
194
}
180
195
181
- /**
182
- * This will ensure that the next event received after this method is called will not be filtered
183
- * out.
184
- *
185
- * @param resourceID - to which the event is related
186
- */
187
- public void whitelistNextEvent (ResourceID resourceID ) {
188
- if (onceWhitelistEventFilterEventFilter != null ) {
189
- onceWhitelistEventFilterEventFilter .whitelistNextEvent (resourceID );
190
- }
191
- }
192
-
193
-
194
196
private void handleKubernetesClientException (Exception e ) {
195
197
KubernetesClientException ke = (KubernetesClientException ) e ;
196
198
if (404 == ke .getCode ()) {
@@ -204,6 +206,13 @@ private void handleKubernetesClientException(Exception e) {
204
206
205
207
@ Override
206
208
public Optional <T > getAssociated (T primary ) {
207
- return cache . get (ResourceID .fromResource (primary ));
209
+ return get (ResourceID .fromResource (primary ));
208
210
}
211
+
212
+ public void handleRecentResourceUpdate (T resource ,
213
+ T previousResourceVersion ) {
214
+ temporaryResourceCache .putUpdatedResource (resource ,
215
+ previousResourceVersion .getMetadata ().getResourceVersion ());
216
+ }
217
+
209
218
}
0 commit comments