use of com.google.common.cache.CacheLoader.InvalidCacheLoadException in project caffeine by ben-manes.
the class CacheLoadingTest method testConcurrentLoadingNull.
/**
* On a concurrent computation that returns null, all threads should get an
* InvalidCacheLoadException, with the loader only called once. The result should not be cached
* (a later request should call the loader again).
*/
private static void testConcurrentLoadingNull(Caffeine<Object, Object> builder) throws InterruptedException {
int count = 10;
final AtomicInteger callCount = new AtomicInteger();
final CountDownLatch startSignal = new CountDownLatch(count + 1);
LoadingCache<String, String> cache = CaffeinatedGuava.build(builder, new CacheLoader<String, String>() {
@Override
public String load(String key) {
callCount.incrementAndGet();
Uninterruptibles.awaitUninterruptibly(startSignal);
return null;
}
});
List<Object> result = doConcurrentGet(cache, "bar", count, startSignal);
assertEquals(count, callCount.get());
for (int i = 0; i < count; i++) {
assertTrue(result.get(i) instanceof InvalidCacheLoadException);
}
// subsequent calls should call the loader again, not get the old exception
try {
cache.getUnchecked("bar");
fail();
} catch (InvalidCacheLoadException expected) {
}
assertEquals(count + 1, callCount.get());
}
use of com.google.common.cache.CacheLoader.InvalidCacheLoadException in project guava by google.
the class LocalCache method loadAll.
/**
* Returns the result of calling {@link CacheLoader#loadAll}, or null if {@code loader} doesn't
* implement {@code loadAll}.
*/
@Nullable
Map<K, V> loadAll(Set<? extends K> keys, CacheLoader<? super K, V> loader) throws ExecutionException {
checkNotNull(loader);
checkNotNull(keys);
Stopwatch stopwatch = Stopwatch.createStarted();
Map<K, V> result;
boolean success = false;
try {
// safe since all keys extend K
@SuppressWarnings("unchecked") Map<K, V> map = (Map<K, V>) loader.loadAll(keys);
result = map;
success = true;
} catch (UnsupportedLoadingOperationException e) {
success = true;
throw e;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new ExecutionException(e);
} catch (RuntimeException e) {
throw new UncheckedExecutionException(e);
} catch (Exception e) {
throw new ExecutionException(e);
} catch (Error e) {
throw new ExecutionError(e);
} finally {
if (!success) {
globalStatsCounter.recordLoadException(stopwatch.elapsed(NANOSECONDS));
}
}
if (result == null) {
globalStatsCounter.recordLoadException(stopwatch.elapsed(NANOSECONDS));
throw new InvalidCacheLoadException(loader + " returned null map from loadAll");
}
stopwatch.stop();
// TODO(fry): batch by segment
boolean nullsPresent = false;
for (Entry<K, V> entry : result.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
if (key == null || value == null) {
// delay failure until non-null entries are stored
nullsPresent = true;
} else {
put(key, value);
}
}
if (nullsPresent) {
globalStatsCounter.recordLoadException(stopwatch.elapsed(NANOSECONDS));
throw new InvalidCacheLoadException(loader + " returned null keys or values from loadAll");
}
// TODO(fry): record count of loaded entries
globalStatsCounter.recordLoadSuccess(stopwatch.elapsed(NANOSECONDS));
return result;
}
use of com.google.common.cache.CacheLoader.InvalidCacheLoadException in project guava by google.
the class CacheLoadingTest method testConcurrentLoadingNull.
/**
* On a concurrent computation that returns null, all threads should get an
* InvalidCacheLoadException, with the loader only called once. The result should not be cached (a
* later request should call the loader again).
*/
private static void testConcurrentLoadingNull(CacheBuilder<Object, Object> builder) throws InterruptedException {
int count = 10;
final AtomicInteger callCount = new AtomicInteger();
final CountDownLatch startSignal = new CountDownLatch(count + 1);
LoadingCache<String, String> cache = builder.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws InterruptedException {
callCount.incrementAndGet();
startSignal.await();
return null;
}
});
List<Object> result = doConcurrentGet(cache, "bar", count, startSignal);
assertEquals(1, callCount.get());
for (int i = 0; i < count; i++) {
assertThat(result.get(i)).isInstanceOf(InvalidCacheLoadException.class);
}
// subsequent calls should call the loader again, not get the old exception
try {
cache.getUnchecked("bar");
fail();
} catch (InvalidCacheLoadException expected) {
}
assertEquals(2, callCount.get());
}
use of com.google.common.cache.CacheLoader.InvalidCacheLoadException in project guava by hceylan.
the class LocalCache method loadAll.
/**
* Returns the result of calling {@link CacheLoader#loadAll}, or null if {@code loader} doesn't
* implement {@code loadAll}.
*/
@Nullable
Map<K, V> loadAll(Set<? extends K> keys, CacheLoader<? super K, V> loader) throws ExecutionException {
Stopwatch stopwatch = new Stopwatch().start();
Map<K, V> result;
boolean success = false;
try {
// safe since all keys extend K
@SuppressWarnings("unchecked") Map<K, V> map = (Map<K, V>) loader.loadAll(keys);
result = map;
success = true;
} catch (UnsupportedLoadingOperationException e) {
success = true;
throw e;
} catch (RuntimeException e) {
throw new UncheckedExecutionException(e);
} catch (Exception e) {
throw new ExecutionException(e);
} catch (Error e) {
throw new ExecutionError(e);
} finally {
if (!success) {
globalStatsCounter.recordLoadException(stopwatch.elapsedTime(NANOSECONDS));
}
}
if (result == null) {
globalStatsCounter.recordLoadException(stopwatch.elapsedTime(NANOSECONDS));
throw new InvalidCacheLoadException(loader + " returned null map from loadAll");
}
stopwatch.stop();
// TODO(fry): batch by segment
boolean nullsPresent = false;
for (Map.Entry<K, V> entry : result.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
if (key == null || value == null) {
// delay failure until non-null entries are stored
nullsPresent = true;
} else {
put(key, value);
}
}
if (nullsPresent) {
globalStatsCounter.recordLoadException(stopwatch.elapsedTime(NANOSECONDS));
throw new InvalidCacheLoadException(loader + " returned null keys or values from loadAll");
}
// TODO(fry): record count of loaded entries
globalStatsCounter.recordLoadSuccess(stopwatch.elapsedTime(NANOSECONDS));
return result;
}
use of com.google.common.cache.CacheLoader.InvalidCacheLoadException in project guava by hceylan.
the class CacheLoadingTest method testConcurrentLoadingNull.
/**
* On a concurrent computation that returns null, all threads should get an
* InvalidCacheLoadException, with the loader only called once. The result should not be cached
* (a later request should call the loader again).
*/
private static void testConcurrentLoadingNull(CacheBuilder<Object, Object> builder) throws InterruptedException {
int count = 10;
final AtomicInteger callCount = new AtomicInteger();
final CountDownLatch startSignal = new CountDownLatch(count + 1);
LoadingCache<String, String> cache = builder.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws InterruptedException {
callCount.incrementAndGet();
startSignal.await();
return null;
}
});
List<Object> result = doConcurrentGet(cache, "bar", count, startSignal);
assertEquals(1, callCount.get());
for (int i = 0; i < count; i++) {
assertTrue(result.get(i) instanceof InvalidCacheLoadException);
}
// subsequent calls should call the loader again, not get the old exception
try {
cache.getUnchecked("bar");
fail();
} catch (InvalidCacheLoadException expected) {
}
assertEquals(2, callCount.get());
}
Aggregations