Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Commit da7cc52

Browse files
authored
Merge pull request #69 from jhinch/bug/68/wrap-with-optional-in-loading-cache
Bug #68 - Wrap nullable values in Optional to avoid InvalidCacheLoadException from Guava cache
2 parents c0a9578 + ca484e0 commit da7cc52

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/main/java/com/launchdarkly/client/RedisFeatureStore.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.launchdarkly.client;
22

3+
import com.google.common.base.Optional;
34
import com.google.common.cache.CacheBuilder;
45
import com.google.common.cache.CacheLoader;
56
import com.google.common.cache.CacheStats;
@@ -37,7 +38,7 @@ public class RedisFeatureStore implements FeatureStore {
3738
private static final String INIT_KEY = "$initialized$";
3839
private static final String CACHE_REFRESH_THREAD_POOL_NAME_FORMAT = "RedisFeatureStore-cache-refresher-pool-%d";
3940
private final JedisPool pool;
40-
private LoadingCache<String, FeatureFlag> cache;
41+
private LoadingCache<String, Optional<FeatureFlag>> cache;
4142
private LoadingCache<String, Boolean> initCache;
4243
private String prefix;
4344
private ListeningExecutorService executorService;
@@ -155,11 +156,11 @@ private void createCache(long cacheTimeSecs, boolean refreshStaleValues, boolean
155156
}
156157
}
157158

158-
private CacheLoader<String, FeatureFlag> createDefaultCacheLoader() {
159-
return new CacheLoader<String, FeatureFlag>() {
159+
private CacheLoader<String, Optional<FeatureFlag>> createDefaultCacheLoader() {
160+
return new CacheLoader<String, Optional<FeatureFlag>>() {
160161
@Override
161-
public FeatureFlag load(String key) throws Exception {
162-
return getRedis(key);
162+
public Optional<FeatureFlag> load(String key) throws Exception {
163+
return Optional.fromNullable(getRedis(key));
163164
}
164165
};
165166
}
@@ -174,7 +175,7 @@ private void createRefreshCache(long cacheTimeSecs, boolean asyncRefresh) {
174175
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(CACHE_REFRESH_THREAD_POOL_NAME_FORMAT).setDaemon(true).build();
175176
ExecutorService parentExecutor = Executors.newSingleThreadExecutor(threadFactory);
176177
executorService = MoreExecutors.listeningDecorator(parentExecutor);
177-
CacheLoader<String, FeatureFlag> cacheLoader = createDefaultCacheLoader();
178+
CacheLoader<String, Optional<FeatureFlag>> cacheLoader = createDefaultCacheLoader();
178179
if (asyncRefresh) {
179180
cacheLoader = CacheLoader.asyncReloading(cacheLoader, executorService);
180181
}
@@ -214,7 +215,7 @@ public Boolean load(String key) throws Exception {
214215
public FeatureFlag get(String key) {
215216
FeatureFlag featureFlag;
216217
if (cache != null) {
217-
featureFlag = cache.getUnchecked(key);
218+
featureFlag = cache.getUnchecked(key).orNull();
218219
} else {
219220
featureFlag = getRedis(key);
220221
}

0 commit comments

Comments
 (0)