Skip to content
This repository was archived by the owner on Jan 9, 2025. It is now read-only.
This repository was archived by the owner on Jan 9, 2025. It is now read-only.

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

Description

@stesie

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions