1212*/
1313package io .kubernetes .client .spring .extended .manifests ;
1414
15- import com .github .benmanes .caffeine .cache .CacheLoader ;
15+ import com .github .benmanes .caffeine .cache .Cache ;
1616import com .github .benmanes .caffeine .cache .Caffeine ;
17- import com .github .benmanes .caffeine .cache .LoadingCache ;
1817import io .kubernetes .client .openapi .models .V1ConfigMap ;
1918import io .kubernetes .client .spring .extended .manifests .annotation .FromConfigMap ;
2019import io .kubernetes .client .spring .extended .manifests .config .KubernetesManifestsProperties ;
2120import io .kubernetes .client .spring .extended .manifests .configmaps .ConfigMapGetter ;
2221import java .lang .reflect .Field ;
2322import java .util .Map ;
23+ import java .util .Set ;
2424import java .util .concurrent .Executors ;
2525import java .util .concurrent .ScheduledExecutorService ;
2626import java .util .concurrent .TimeUnit ;
27- import java .util .function .Supplier ;
28- import org .checkerframework .checker .nullness .qual .NonNull ;
29- import org .checkerframework .checker .nullness .qual .Nullable ;
3027import org .slf4j .Logger ;
3128import org .slf4j .LoggerFactory ;
3229import org .springframework .beans .BeansException ;
@@ -80,15 +77,7 @@ public Object postProcessAfterInitialization(Object bean, String beanName) throw
8077 ConfigMapGetter configMapGetter =
8178 getOrCreateConfigMapGetter (fromConfigMapAnnotation , applicationContext );
8279
83- LoadingCache <String , String > configMapDataCache =
84- Caffeine .newBuilder ()
85- .expireAfterWrite (manifestsProperties .getRefreshInterval ())
86- .build (
87- new ConfigMapGetterCacheLoader (
88- () -> {
89- return configMapGetter .get (
90- fromConfigMapAnnotation .namespace (), fromConfigMapAnnotation .name ());
91- }));
80+ Cache <String , String > configMapDataCache = Caffeine .newBuilder ().build ();
9281 fullyRefreshCache (configMapGetter , fromConfigMapAnnotation , configMapDataCache );
9382 configMapKeyRefresher .scheduleAtFixedRate (
9483 () -> {
@@ -106,14 +95,19 @@ public Object postProcessAfterInitialization(Object bean, String beanName) throw
10695 private static void fullyRefreshCache (
10796 ConfigMapGetter configMapGetter ,
10897 FromConfigMap fromConfigMapAnnotation ,
109- LoadingCache <String , String > configMapDataCache ) {
98+ Cache <String , String > configMapDataCache ) {
11099 V1ConfigMap configMap =
111100 configMapGetter .get (fromConfigMapAnnotation .namespace (), fromConfigMapAnnotation .name ());
112101 if (configMap == null || configMap .getData () == null ) {
102+ configMapDataCache .invalidateAll ();
113103 return ;
114104 }
115105 // TODO: make the cache data refreshment atomic
116- configMap .getData ().keySet ().stream ().forEach (key -> configMapDataCache .refresh (key ));
106+ Map <String , String > newData = configMap .getData ();
107+ newData .forEach (configMapDataCache ::put );
108+ Set .copyOf (configMapDataCache .asMap ().keySet ()).stream ()
109+ .filter (key -> !newData .containsKey (key ))
110+ .forEach (configMapDataCache ::invalidate );
117111 }
118112
119113 private ConfigMapGetter getOrCreateConfigMapGetter (
@@ -144,22 +138,4 @@ private ConfigMapGetter getOrCreateConfigMapGetter(
144138 public void setApplicationContext (ApplicationContext applicationContext ) throws BeansException {
145139 this .applicationContext = applicationContext ;
146140 }
147-
148- static class ConfigMapGetterCacheLoader implements CacheLoader <String , String > {
149-
150- ConfigMapGetterCacheLoader (Supplier <V1ConfigMap > configMapSupplier ) {
151- this .configMapSupplier = configMapSupplier ;
152- }
153-
154- private final Supplier <V1ConfigMap > configMapSupplier ;
155-
156- @ Override
157- public @ Nullable String load (@ NonNull String key ) throws Exception {
158- V1ConfigMap configMap = this .configMapSupplier .get ();
159- if (configMap == null || configMap .getData () == null ) {
160- return null ;
161- }
162- return configMap .getData ().get (key );
163- }
164- }
165141}
0 commit comments