[ 
https://issues.apache.org/jira/browse/CAMEL-10829?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paolo Antinori updated CAMEL-10829:
-----------------------------------
    Description: 
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 (and reason if 
the scripting API needs to be changed for other runtimes too), or  this should 
be handled on JRuby one.

  was:
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.


> [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 (and reason 
> if the scripting API needs to be changed for other runtimes too), or  this 
> should be handled on JRuby one.



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

Reply via email to