[ https://issues.apache.org/jira/browse/IGNITE-12096?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Nikolay Izhikov updated IGNITE-12096: ------------------------------------- Fix Version/s: (was: 2.8.1) > Used memory metric does not contract when cache is emptied - FreeList > REUSE_BUCKET is not accounted for > ------------------------------------------------------------------------------------------------------- > > Key: IGNITE-12096 > URL: https://issues.apache.org/jira/browse/IGNITE-12096 > Project: Ignite > Issue Type: Bug > Components: cache > Affects Versions: 2.7 > Reporter: Colin Cassidy > Priority: Major > Fix For: 2.9 > > > When using the Ignite metrics API to measure available memory, the usage > figures appear to be accurate while memory is being consumed - but when > memory is freed the metrics do not drop. They appear to report that memory > has not been freed up, even though it has. > A reliable estimate of memory consumption is very important for solutions > that don't use native persistence - as this is the only controllable way of > avoiding a critical OOM condition. > Reproducer below. This affects Ignite 2.7+. > {{public class MemoryTest2 { }} > {{ private static final String CACHE_NAME = "cache"; }} > {{ private static final String DEFAULT_MEMORY_REGION = "Default_Region"; > }} > {{ private static final long MEM_SIZE = 100L * 1024 * 1024; }} > {{ @Test }} > {{ public void testOOM() throws InterruptedException { }} > {{ try (Ignite ignite = startIgnite("IgniteMemoryMonitorTest1")) { }} > {{ fillDataRegion(ignite); }} > {{ CacheConfiguration<Object, Object> cfg = new }} > {{CacheConfiguration<>(CACHE_NAME); }} > {{ cfg.setStatisticsEnabled(true); }} > {{ IgniteCache<Object, Object> cache = }} > {{ignite.getOrCreateCache(cfg); }} > {{ // Clear all entries from the cache to free up memory }} > {{ memUsed(ignite); }} > {{ cache.clear(); }} > {{ cache.removeAll(); }} > {{ cache.put("Key", "Value"); }} > {{ memUsed(ignite); }} > {{ cache.destroy(); }} > {{ Thread.sleep(5000); }} > {{ // Should now report close to 0% but reports 59% still }} > {{ memUsed(ignite); }} > {{ } }} > {{ } }} > {{ }} > {{ private Ignite startIgnite(String instanceName) { }} > {{ IgniteConfiguration cfg = new IgniteConfiguration(); }} > {{ cfg.setIgniteInstanceName(instanceName); }} > {{ cfg.setDataStorageConfiguration(createDataStorageConfiguration()); > }} > {{ cfg.setFailureHandler(new NoOpFailureHandler()); }} > {{ return Ignition.start(cfg); }} > {{ } }} > {{ private DataStorageConfiguration createDataStorageConfiguration() { }} > {{ return new DataStorageConfiguration() }} > {{ .setDefaultDataRegionConfiguration( }} > {{ new DataRegionConfiguration() }} > {{ .setName(DEFAULT_MEMORY_REGION) }} > {{ .setInitialSize(MEM_SIZE) }} > {{ .setMaxSize(MEM_SIZE) }} > {{ .setMetricsEnabled(true)); }} > {{ } }} > {{ private void fillDataRegion(Ignite ignite) { }} > {{ byte[] megabyte = new byte[1024 * 1024]; }} > {{ IgniteCache<Object, Object> cache = }} > {{ ignite.getOrCreateCache(CACHE_NAME); }} > {{ for (int i = 0; i < 50; i++) { }} > {{ cache.put(i, megabyte); }} > {{ memUsed(ignite); }} > {{ } }} > {{ } }} > {{ private void memUsed(Ignite ignite) { }} > {{ DataRegionConfiguration defaultDataRegionCfg = }} > {{ignite.configuration() }} > {{ .getDataStorageConfiguration() }} > {{ .getDefaultDataRegionConfiguration(); }} > {{ String regionName = defaultDataRegionCfg.getName(); }} > {{ DataRegionMetrics metrics = ignite.dataRegionMetrics(regionName); > }} > {{ float usedMem = metrics.getPagesFillFactor() * }} > {{metrics.getTotalAllocatedPages() * metrics.getPageSize(); }} > {{ float pctUsed = 100 * usedMem / defaultDataRegionCfg.getMaxSize(); > }} > {{ System.out.println("Memory used: " + pctUsed + "%"); }} > {{ } }} > {{} }} -- This message was sent by Atlassian Jira (v8.3.4#803005)