Ilya Kasnacheev created IGNITE-12837:
----------------------------------------

             Summary: Make sure Ignite leaves nothing in static fields after 
node is stopped, write test
                 Key: IGNITE-12837
                 URL: https://issues.apache.org/jira/browse/IGNITE-12837
             Project: Ignite
          Issue Type: Improvement
          Components: general
            Reporter: Ilya Kasnacheev


{code}
There are at least two way link to IgniteKernal leaks to GC root and makes it
unavailable for GC.

  1. The first one:

this - value: org.apache.ignite.internal.IgniteKernal #1
<\- grid - class: org.apache.ignite.internal.GridKernalContextImpl, value:
org.apache.ignite.internal.IgniteKernal #1
<\- ctx - class:
org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing, value:
org.apache.ignite.internal.GridKernalContextImpl #2
<\- this$0 - class:
org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$10, value:
org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing #2
<\- serializer - class: org.h2.util.JdbcUtils, value:
org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$10 #1
<\- [5395] - class: java.lang.Object[], value: org.h2.util.JdbcUtils class
JdbcUtils
<\- elementData - class: java.util.Vector, value: java.lang.Object[] #37309
<\- classes - class: sun.misc.Launcher$AppClassLoader, value: java.util.Vector
#31
<\- contextClassLoader (thread object) - class: java.lang.Thread, value:
sun.misc.Launcher$AppClassLoader #1

org.h2.util.JdbcUtils has static field JavaObjectSerializer serializer, which
see IgniteKernal via IgniteH2Indexing. It make closed and stopped IgniteKernal
non collectable by GC.
If some Ignites run in same JVM, JdbcUtils will always use only one, and it
can cause some races.

  2. The second way:

this - value: org.apache.ignite.internal.IgniteKernal #2
<\- grid - class: org.apache.ignite.internal.GridKernalContextImpl, value:
org.apache.ignite.internal.IgniteKernal #2
<\- ctx - class: org.apache.ignite.internal.processors.cache.GridCacheContext,
value: org.apache.ignite.internal.GridKernalContextImpl #1
<\- cctx - class:
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry,
value: org.apache.ignite.internal.processors.cache.GridCacheContext #24
<\- parent - class:
org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate, value:
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry
#4
<\- [0] - class: java.lang.Object[], value:
org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate #1
<\- elements - class: java.util.ArrayDeque, value: java.lang.Object[] #43259
<\- value - class: java.lang.ThreadLocal$ThreadLocalMap$Entry, value:
java.util.ArrayDeque #816
<\- [119] - class: java.lang.ThreadLocal$ThreadLocalMap$Entry[], value:
java.lang.ThreadLocal$ThreadLocalMap$Entry #51
<\- table - class: java.lang.ThreadLocal$ThreadLocalMap, value:
java.lang.ThreadLocal$ThreadLocalMap$Entry[] #21
<\- threadLocals (thread object) - class: java.lang.Thread, value:
java.lang.ThreadLocal$ThreadLocalMap #2
{code}
as reported on mailing list.

I suggest we fix that (make sure Ignite node leaves nothing in static fields/GC 
roots after it is stopped). I also suggest we introduce a check, probably by 
using jmap and searching dump for IgniteKernal, etc.

It would also be nice to check that if Ignite is loaded to non-root class 
loader, started and stopped, it would allow this class-loader to unload Ignite 
classes.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to