[ https://issues.apache.org/jira/browse/IGNITE-15962?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexey Kukushkin updated IGNITE-15962: -------------------------------------- Labels: cggg (was: ) > CacheEntryRemovedListener makes the PUT operation to create ENTRY CREATED > events > -------------------------------------------------------------------------------- > > Key: IGNITE-15962 > URL: https://issues.apache.org/jira/browse/IGNITE-15962 > Project: Ignite > Issue Type: Improvement > Affects Versions: 2.11 > Reporter: Alexey Kukushkin > Priority: Major > Labels: cggg > Attachments: CacheContinuousQueryEntry-HeapDump.png, > CacheContinuousQueryEntry-StackTrace.png, EventListenerHeapUsage.java, > IgniteServer.java, build.gradle > > > {{CacheEntryRemovedListener}} configured with > {{MutableCacheEntryListenerConfiguration.isOldValueRequired = false}} makes > the {{Cache#put}} operation to create {{CREATED}} events on the primary > server for a short period of time. This is inefficient when working with > large objects: our application running with limited heap memory fails with > {{java.lang.OutOfMemoryError: Java heap space}} after executing a {{PUT}} > operation since the entry referencing the object is "stuck" on the heap. > h2. Reproducer > h3. Steps > We need two Ignite server nodes to demonstrate the problem. A cache is > deployed on both the nodes and both the nodes listen to the {{ENTRY REMOVED}} > events. Both the nodes disable fetching the {{CacheEntryEvent#getOldValue}} > by setting {{MutableCacheEntryListenerConfiguration.isOldValueRequired = > false}} > # Build and run the attached [^IgniteServer.java]. This server is configured > like described above and runs until manually terminated. > # Build the run the attached test [^EventListenerHeapUsage.java] . This test: > ## Starts another server configured like described above > ## Puts a large object taking 35% of the free memory. This is done in an > isolated scope so the memory after the operation is garbage collected, > ## Attempts to allocate 70% of the heap. > h3. Expected > The last "allocate 70% of the heap" operation should succeed. > h3. Actual > {noformat} > Caused by: java.lang.OutOfMemoryError: Java heap space > at > apache.ignite.issues.EventListenerHeapUsage.entryRemovedEventListenerFetchesValueOnHeap(EventListenerHeapUsage.java:33) > {noformat} > h2 Analysis > For some reason configuring the event listener makes the {{IgniteCache#put}} > operation to create and attach an instance of {{CacheContinuousQueryEntry}} > with {{evtType=CREATED}} and {{newObject}} referencing the entry. > The attached heap dump !CacheContinuousQueryEntry-HeapDump.png! collected on > the {{OutOfMemoryError}} demonstrates the large object "stuck" on the heap. > The attached {{CacheContinuousQueryEntry}} initialization > !CacheContinuousQueryEntry-StackTrace.png! proves the {{ENTRY CREATED}} event > is being created even though we did not configure it. > It seems wrong that Ignite needs to attached the {{ENTRY CREATED}} event to > the "update" message. Please enhance Ignite to not be doing that or explain > why Ignite must do that. -- This message was sent by Atlassian Jira (v8.20.1#820001)