[jboss-jira] [JBoss JIRA] (DROOLS-1383) Deadlock in PackageClassLoader
Arkady Syamtomov (JIRA)
issues at jboss.org
Mon Feb 20 14:41:00 EST 2017
[ https://issues.jboss.org/browse/DROOLS-1383?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13366502#comment-13366502 ]
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)
More information about the jboss-jira
mailing list