Environment Details
- MicroStream Version: 08.01.01-MS-GA
- JDK version: GraalVM 21.0.1+12.1
- OS: MacOS 14.2.1
Describe the bug
Given a cache with an CreatedExpiryPolicy, read-through enabled and with a cache loader.
Cache is always just accessed via get(K key) method.
Initially cache accesses work fine.
As soon as the cache item has expired the following happens once (in Cache$Default#getValue):
- isExpired is detected as true ✅
- the old entry is removed from the cache ✅
loadCacheEntry is called to provide a new value ✅
expiryForCreation is calculated based on the old item's creation time, hence it immediately is expired again ❓
value (returned from the loader) is then overriden to null ❓
Why is this? I see this was introduced by #369, which unfortunately has no (or just private) description.
Subsequent calls to get work fine again, since the old entry was removed and hence next call will just establish a new one.
To Reproduce
Given the following cache configuration
final MutableConfiguration<String, Object> configuration = new MutableConfiguration<>();
configuration.setReadThrough(true);
configuration.setCacheLoaderFactory(new FactoryBuilder.SingletonFactory<>(new SomeCustomCacheLoader()));
configuration.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_DAY));
configuration.setStoreByValue(false);
Then get("whatever")... wait for the expiry period to have passed ... then get("whatever") again.
Expected behavior
Should return the actual value from the loader.