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

@stesie

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.

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