You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by "Avihai Berkovitz (JIRA)" <ji...@apache.org> on 2016/03/24 14:37:25 UTC

[jira] [Created] (IGNITE-2888) Eviction policy not called upon cache.remove()

Avihai Berkovitz created IGNITE-2888:
----------------------------------------

             Summary: Eviction policy not called upon cache.remove()
                 Key: IGNITE-2888
                 URL: https://issues.apache.org/jira/browse/IGNITE-2888
             Project: Ignite
          Issue Type: Bug
          Components: cache
    Affects Versions: 1.5.0.final
         Environment: java version "1.8.0_73"
Java(TM) SE Runtime Environment (build 1.8.0_73-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)
Windows 10 64bit
            Reporter: Avihai Berkovitz


When I set an eviction policy to a cache it doesn't get called when removing an entry from the cache. This only happens when using a *REPLICATED* or *PARTITIONED* cache, and only in *ATOMIC* mode. This is the reason it never came up in the GridCacheConcurrentEvictionConsistencySelfTest test. If you change the cache parameters in the test you can see the problem easily.
This causes two problems:
* Cache entries that were deleted still remain in memory, because the objects are referenced by the policy
* The eviction policy "thinks" the cache is larger than it really is, so entries might be evicted even if there is no need for it

Here is a small test case to illustrate the problem:
{code}
IgniteConfiguration igniteConfig = new IgniteConfiguration()
        .setGridLogger(new Slf4jLogger())
        .setDeploymentMode(DeploymentMode.CONTINUOUS);
try (Ignite ignite = Ignition.start(igniteConfig)) {
    LruEvictionPolicy evictionPolicy = new LruEvictionPolicy(30);
    CacheConfiguration<String, String> cacheConfiguration = new CacheConfiguration<String, String>()
            .setName("test")
            .setCacheMode(CacheMode.REPLICATED)
            .setAtomicityMode(CacheAtomicityMode.ATOMIC)
            .setEvictionPolicy(evictionPolicy);
    IgniteCache<String, String> cache = ignite.getOrCreateCache(cacheConfiguration);

    for (int i = 1; i <= 100; i++) {
        cache.put("key" + i, "data");
        System.out.println(String.format("Size: %d, LRU: %d", cache.size(CachePeekMode.ALL), evictionPolicy.getCurrentSize()));
        if (i % 5 == 0) {
            cache.remove("key" + (i-1));
            System.out.println(String.format("Size: %d, LRU: %d", cache.size(CachePeekMode.ALL), evictionPolicy.getCurrentSize()));
        }
    }
}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)