[
https://issues.jboss.org/browse/DROOLS-1383?page=com.atlassian.jira.plugi...
]
Arkady Syamtomov commented on DROOLS-1383:
------------------------------------------
Thanks fir that prompt reply!
the class I attached was just for demo purposes - to outline the points we found as
responsible for mutual thread locking. About the blacklisted classes and resources I
preferred to leave the existing set alone, firstly it's not thread safe anyways,
secondly - did not want to introduce additional implications to the existing code.
Whatsoever these "blacklist" sets were to address quite specific issues with
existing code - skip multiple Class.forName or ClassLoader.getResource calls for the same
key. I'm not even sure we do now really need those - they were introduced as a first
attempt to find solution.
I completely agree with your comment about static maps and sets members, but these are
just to indicate that we do need a kind of cache scoping. Whether it's a JVM, thread,
or project - does not matter. But when running the building in multiple threads we need to
make sure we don't block threads trying to access Class.forName at the same time -
these calls are heavyweight and synchronised.
One of key points in the code for us is attempt to skip the names, that are not classes -
and these really massively influence the performance as causing a huge amount of calls,
resulting in ClassNotFoundException. In our case the pattern is simple (any string ending
with "_query"), but in general any kind of configuration would suffice (the
default behaviour could remain unaltered). Any kind of ProjectClassLoader extension
mechanism would work (e.g. standard java lookup service)... At the moment it's not
simply possible to substitute it with any inheriting class. Would it be possible for you
to consider these changes for future release or as a patch to existing one? Thank you a
lot!
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
Attachments: ProjectClassLoader.java
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)