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)