55import java .util .Objects ;
66import java .util .Optional ;
77import java .util .concurrent .ConcurrentHashMap ;
8+ import java .util .function .Predicate ;
9+ import java .util .stream .Stream ;
810
911import org .slf4j .Logger ;
1012import org .slf4j .LoggerFactory ;
2224import io .javaoperatorsdk .operator .processing .MDCUtils ;
2325import io .javaoperatorsdk .operator .processing .event .ResourceID ;
2426import io .javaoperatorsdk .operator .processing .event .source .AbstractResourceEventSource ;
27+ import io .javaoperatorsdk .operator .processing .event .source .ResourceCache ;
2528
2629import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getName ;
2730import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getUID ;
2831import static io .javaoperatorsdk .operator .processing .KubernetesResourceUtils .getVersion ;
2932
3033public class ControllerResourceEventSource <T extends HasMetadata >
3134 extends AbstractResourceEventSource <T , T >
32- implements ResourceEventHandler <T > {
35+ implements ResourceEventHandler <T >, ResourceCache < T > {
3336
3437 public static final String ANY_NAMESPACE_MAP_KEY = "anyNamespace" ;
3538
@@ -40,8 +43,8 @@ public class ControllerResourceEventSource<T extends HasMetadata>
4043 new ConcurrentHashMap <>();
4144
4245 private final ResourceEventFilter <T > filter ;
43- private final OnceWhitelistEventFilterEventFilter <T > onceWhitelistEventFilterEventFilter ;
4446 private final ControllerResourceCache <T > cache ;
47+ private final TemporaryResourceCache <T > temporaryResourceCache ;
4548
4649 public ControllerResourceEventSource (Controller <T > controller ) {
4750 super (controller .getConfiguration ().getResourceClass ());
@@ -50,20 +53,12 @@ public ControllerResourceEventSource(Controller<T> controller) {
5053 var cloner = configurationService != null ? configurationService .getResourceCloner ()
5154 : ConfigurationService .DEFAULT_CLONER ;
5255 this .cache = new ControllerResourceCache <>(sharedIndexInformers , cloner );
53-
56+ temporaryResourceCache = new TemporaryResourceCache <>( cache );
5457 var filters = new ResourceEventFilter [] {
5558 ResourceEventFilters .finalizerNeededAndApplied (),
5659 ResourceEventFilters .markedForDeletion (),
57- ResourceEventFilters .generationAware (),
58- null
60+ ResourceEventFilters .generationAware ()
5961 };
60-
61- if (controller .getConfiguration ().isGenerationAware ()) {
62- onceWhitelistEventFilterEventFilter = new OnceWhitelistEventFilterEventFilter <>();
63- filters [filters .length - 1 ] = onceWhitelistEventFilterEventFilter ;
64- } else {
65- onceWhitelistEventFilterEventFilter = null ;
66- }
6762 if (controller .getConfiguration ().getEventFilter () != null ) {
6863 filter = controller .getConfiguration ().getEventFilter ().and (ResourceEventFilters .or (filters ));
6964 } else {
@@ -126,6 +121,7 @@ public void eventReceived(ResourceAction action, T customResource, T oldResource
126121 try {
127122 log .debug (
128123 "Event received for resource: {}" , getName (customResource ));
124+ temporaryResourceCache .removeResourceFromCache (customResource );
129125 MDCUtils .addResourceInfo (customResource );
130126 controller .getEventSourceManager ().broadcastOnResourceEvent (action , customResource ,
131127 oldResource );
@@ -158,12 +154,31 @@ public void onDelete(T resource, boolean b) {
158154 eventReceived (ResourceAction .DELETED , resource , null );
159155 }
160156
157+
158+ @ Override
161159 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 );
163177 }
164178
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 );
167182 }
168183
169184 /**
@@ -178,19 +193,6 @@ public SharedIndexInformer<T> getInformer(String namespace) {
178193 return getInformers ().get (Objects .requireNonNullElse (namespace , ANY_NAMESPACE_MAP_KEY ));
179194 }
180195
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-
194196 private void handleKubernetesClientException (Exception e ) {
195197 KubernetesClientException ke = (KubernetesClientException ) e ;
196198 if (404 == ke .getCode ()) {
@@ -204,6 +206,13 @@ private void handleKubernetesClientException(Exception e) {
204206
205207 @ Override
206208 public Optional <T > getAssociated (T primary ) {
207- return cache . get (ResourceID .fromResource (primary ));
209+ return get (ResourceID .fromResource (primary ));
208210 }
211+
212+ public void handleRecentResourceUpdate (T resource ,
213+ T previousResourceVersion ) {
214+ temporaryResourceCache .putUpdatedResource (resource ,
215+ previousResourceVersion .getMetadata ().getResourceVersion ());
216+ }
217+
209218}
0 commit comments