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)