Paolo Antinori created CAMEL-10829:
--------------------------------------

             Summary: [jruby] Issue with multithreading and finalize()
                 Key: CAMEL-10829
                 URL: https://issues.apache.org/jira/browse/CAMEL-10829
             Project: Camel
          Issue Type: Bug
          Components: camel-script
    Affects Versions: 2.18.2
            Reporter: Paolo Antinori


There is a rare to hit issue with {{camel-script}} component and {{jruby}}.

{{camel-script}} passes through this method chain to create a {{jruby}} 
{{ScriptEngine}}:

https://github.com/apache/camel/blob/master/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java#L267-L269

{code:java}
    public static boolean supportScriptLanguage(String language) {
        return createScriptEngine(language, true) != null;
}
{code}

The problem with that code is that it creates a Script Engine instance, but it 
doesn't keep a reference to that  object.

JRuby gives a specialized behavior to {{finalize()}} method of its runtime:

https://github.com/jruby/jruby/blob/jruby-1_7/core/src/main/java/org/jruby/embed/ScriptingContainer.java#L1907-L1929

The combination of the 2 conditions is able to cause situation where the 
{{gc()}} thread, reaps JRuby instances, triggering their clean up methods:

https://github.com/jruby/jruby/blob/jruby-1_7/core/src/main/java/org/jruby/embed/ScriptingContainer.java#L1907-L1929t

before Camel has really finished using it.

This behavior can be noticed in 
https://github.com/apache/camel/blob/master/components/camel-script/src/test/java/org/apache/camel/builder/script/JRubySingletonTest.java
 failing every now and then. Event more frequent when we tried to upgrade to 
jruby 1.7.26: 

https://issues.apache.org/jira/browse/CAMEL-10477


{code}
"main@1" prio=5 tid=0x1 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
          at 
org.apache.camel.builder.script.ScriptBuilder.tryCreateScriptEngine(ScriptBuilder.java:359)
          at 
org.apache.camel.builder.script.ScriptBuilder.createScriptEngine(ScriptBuilder.java:336)
          at 
org.apache.camel.builder.script.ScriptBuilder.supportScriptLanguage(ScriptBuilder.java:268)
          at 
org.apache.camel.builder.script.ScriptLanguageResolver.resolveLanguage(ScriptLanguageResolver.java:30)
          at 
org.apache.camel.builder.script.RubyLanguage.createExpression(RubyLanguage.java:38)
          at 
org.apache.camel.component.language.LanguageEndpoint.createProducer(LanguageEndpoint.java:96)
          at 
org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:439)
          - locked <0x1806> (a org.apache.camel.impl.ProducerCache)
          at 
org.apache.camel.impl.ProducerCache.acquireProducer(ProducerCache.java:160)
          at 
org.apache.camel.processor.SendProcessor.doStart(SendProcessor.java:243)
{code}

Now, I honestly don't know if this should be fixed on Camel side, or if 
{{finalize()}} or if this should be handled on JRuby one.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to