[
https://issues.jboss.org/browse/DROOLS-1383?page=com.atlassian.jira.plugi...
]
Arkady Syamtomov commented on DROOLS-1383:
------------------------------------------
We had the same issue with continuous Class.forName() calls inside the ProjectClassLoader.
If manifested itself especially blocking when we developed the parallel deployment of
rules (we have amounts like 15 000 and more). More investigation showed the locks happen
on continuous Class.forName invocations in fastFindClass and down to call stack. And the
reason was that despite the Class.forName throws NoClassFoundException (e.g. for queries
inside the rule) the ClassLoader continues doing it again and again (instead of storing
the invalid strings in some kind of blacklist). We patched locally the ProjectClassLoader
with the one you'll find in attachment - that boosted the performance by approx 60
times in our case. Please have a look and maybe similar modifications could be applied on
your side (of course there are some name-specific fragments, but I'm sure more generic
solution could be found).
Deadlock in PackageClassLoader
------------------------------
Key: DROOLS-1383
URL:
https://issues.jboss.org/browse/DROOLS-1383
Project: Drools
Issue Type: Bug
Components: core engine
Affects Versions: 6.4.0.Final
Reporter: Karen Zhu
Assignee: Mario Fusco
Priority: Blocker
Found one deadlock in PackageLoader. Did I write rule in a bad way? How did a consequence
of a rule will get the lock of PackageLoader which is needed by checkCerts(). Below is
threaddump information.
Found one Java-level deadlock:
=============================
"Thread-105-CustomClass-executor[17 17]":
waiting to lock monitor 0x00007f933c005b38 (object 0x00007f963ed294b0, a
java.lang.Object),
which is held by "Thread-17-CustomClass-executor[33 33]"
"Thread-17-CustomClass-executor[33 33]":
waiting to lock monitor 0x00007f933c0031f8 (object 0x00007f963ed294c0, a
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader),
which is held by "Thread-33-CustomClass-executor[9 9]"
"Thread-33-CustomClass-executor[9 9]":
waiting to lock monitor 0x00007f933c005b38 (object 0x00007f963ed294b0, a
java.lang.Object),
which is held by "Thread-17-CustomClass-executor[33 33]"
Java stack information for the threads listed above:
===================================================
"Thread-105-CustomClass-executor[17 17]":
at
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.fastFindClass(JavaDialectRuntimeData.java:662)
waiting to lock <0x00007f963ed294b0> (a java.lang.Object)
at
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.loadClass(JavaDialectRuntimeData.java:642)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at
org.drools.core.rule.MVELDialectRuntimeData.getParserConfiguration(MVELDialectRuntimeData.java:299)
at
org.drools.core.base.mvel.MVELCompilationUnit.getCompiledExpression(MVELCompilationUnit.java:238)
at
org.drools.core.rule.constraint.MvelConstraint.createMvelConditionEvaluator(MvelConstraint.java:264)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:248)
at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:214)
at org.drools.core.reteoo.AlphaNode.assertObject(AlphaNode.java:131)
at
org.drools.core.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:63)
at
org.drools.core.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:366)
at org.drools.core.reteoo.ObjectTypeNode.propagateAssert(ObjectTypeNode.java:300)
at org.drools.core.phreak.PropagationEntry$Insert.execute(PropagationEntry.java:93)
at
org.drools.core.phreak.SynchronizedPropagationList.flush(SynchronizedPropagationList.java:78)
at
org.drools.core.phreak.SynchronizedPropagationList.flush(SynchronizedPropagationList.java:73)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.flushPropagations(StatefulKnowledgeSessionImpl.java:2017)
at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1334)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1288)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1306)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1297)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1278)
"Thread-17-CustomClass-executor[33 33]":
at java.lang.ClassLoader.checkCerts(ClassLoader.java:942)
waiting to lock <0x00007f963ed294c0> (a
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader)
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:666)
at java.lang.ClassLoader.defineClass(ClassLoader.java:794)
at
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.internalDefineClass(JavaDialectRuntimeData.java:694)
at
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.fastFindClass(JavaDialectRuntimeData.java:665)
locked <0x00007f963ed294b0> (a java.lang.Object)
at
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.loadClass(JavaDialectRuntimeData.java:642)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at
org.drools.core.rule.MVELDialectRuntimeData.getParserConfiguration(MVELDialectRuntimeData.java:299)
at
org.drools.core.base.mvel.MVELCompilationUnit.getCompiledExpression(MVELCompilationUnit.java:238)
at
org.drools.core.rule.constraint.MvelConstraint.createMvelConditionEvaluator(MvelConstraint.java:264)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:248)
at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:214)
at org.drools.core.reteoo.AlphaNode.assertObject(AlphaNode.java:131)
at
org.drools.core.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:63)
at
org.drools.core.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:366)
at org.drools.core.reteoo.ObjectTypeNode.propagateAssert(ObjectTypeNode.java:300)
at org.drools.core.phreak.PropagationEntry$Insert.execute(PropagationEntry.java:93)
at
org.drools.core.phreak.SynchronizedPropagationList.flush(SynchronizedPropagationList.java:78)
at
org.drools.core.phreak.SynchronizedPropagationList.flush(SynchronizedPropagationList.java:73)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.flushPropagations(StatefulKnowledgeSessionImpl.java:2017)
at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1334)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1288)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1306)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1297)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1278)
"Thread-33-CustomClass-executor[9 9]":
at
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.fastFindClass(JavaDialectRuntimeData.java:662)
waiting to lock <0x00007f963ed294b0> (a java.lang.Object)
at
org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.loadClass(JavaDialectRuntimeData.java:642)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at
com.cdr.apEventWrapperRules.ConstructorApBeansWrapper.constructorApBeansWrapper(ConstructorApBeansWrapper.java:55)
at
com.cdr.apEventWrapperRules.Rule_UCR2359988097.defaultConsequence(Rule_UCR2359988097.java:7)
at
com.cdr.apEventWrapperRules.Rule_UCR2359988097DefaultConsequenceInvokerGenerated.evaluate(Unknown
Source)
at
com.cdr.apEventWrapperRules.Rule_UCR2359988097DefaultConsequenceInvoker.evaluate(Unknown
Source)
at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1089)
at org.drools.core.phreak.RuleExecutor.fire(RuleExecutor.java:121)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:74)
at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1007)
at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1350)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1288)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1306)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1297)
at
org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1278)
Found 1 deadlock.
--
This message was sent by Atlassian JIRA
(v7.2.3#72005)