microstream icon indicating copy to clipboard operation
microstream copied to clipboard

Cache get(...) returns null w/ expired entry and read-through enabled

Open stesie opened this issue 1 year ago • 0 comments

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.

stesie avatar Feb 06 '24 10:02 stesie