Skip to content
This repository was archived by the owner on Oct 3, 2022. It is now read-only.
This repository was archived by the owner on Oct 3, 2022. It is now read-only.

ExpiryPolicy on existing caches lost after calling getCache on non-existing cache #51

@rogerkl

Description

@rogerkl

Had a problem with caches that seem to loose their expiry information.
Tracked down the problem to be caused by calling getCache on a non-existing cache.
It was used to check if the cache existed and if not, create it.

It looks like when JCacheManager.getCache() are not finding a cache in allCaches it
calls refreshallCaches() which will recreate them, but the expiry-configuration seems to be lost.

This test will show the error as the last assert will fail because the expiry-policy is lost.

@Test
public void testRefreshAllCachesError() {
    final CachingProvider cachingProvider = Caching.getCachingProvider();
    final CacheManager cacheManager = cachingProvider.getCacheManager();

    String cacheNameExisting = "existingCache";
    String cacheNameNonExisting = "nonExistingCache";

    MutableConfiguration configuration = new MutableConfiguration();
    configuration.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 60)));

    configuration.setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 60)));
    cacheManager.createCache(cacheNameExisting, new JCacheConfiguration(configuration));

    Cache<Object, Object> sampleCache = cacheManager.getCache(cacheNameExisting);
    assertNotNull(sampleCache);
    assertThat(sampleCache.getConfiguration(JCacheConfiguration.class).getExpiryPolicy().getExpiryForCreation().getDurationAmount(), is(60l));

    // this will trigger refreshAllCaches which recreates caches
    assertNull(cacheManager.getCache(cacheNameNonExisting));

    // existing cache is OK but ...
    assertThat(sampleCache.getConfiguration(JCacheConfiguration.class).getExpiryPolicy().getExpiryForCreation().getDurationAmount(), is(60l));

    // ... if we fetch it again from cacheManager:
    // this will fail as cache existingCache has been recreated and lost its expiry-policy
    sampleCache = cacheManager.getCache(cacheNameExisting);
    assertThat(sampleCache.getConfiguration(JCacheConfiguration.class).getExpiryPolicy().getExpiryForCreation().getDurationAmount(), is(60l));
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions