We are also experiencing the same problems using 5.x and it is causing us
big problems.

I haven't had time to try it yet but do any developers know whether we
would be safe to change the HashMap the CompositiveClassLoader is using to
a ConcurrentHashMap?

thanks
Steve

-------------------------------------------------------------------
Steven Williams



On Wed, Mar 19, 2014 at 12:31 AM, mikerod <mjr4...@gmail.com> wrote:

> I cannot easily reproduce an issue that I'm seeing.  This is an
> intermittent
> issue that happens probably 3% of the time or less.
>
> This is observed behavior in
> * Drools v5.6.0.Final, using
> * Janino compiler v2.5.16 && transitively Drools brings
> * mvel2 v2.1.8.Final
>
> We have an environment that loads around 10 different KnowledgeBases into a
> list.
> Then one-by-one a single StatefulKnowledgeSession is created for a single
> KnowledgeBase, facts are inserted, and then fireAllRules is called.
>
> Every so often, we noticed that we were getting what seemed to be ininite
> looping behavior for during either insertion time or fireAllRules time.
> When we subsequently re-run the *same* session with the *same*
> KnowledgeBase
> and the *same* facts inserted, it was successful and finished in
> milliseconds (the average for our successful runs).  We have repeatedly
> seen
> this behavior of 1 failure, followed by a re-run that is successful.
>
> We were able to attach a profiler to several of these hung sessions to
> determine what was happening.  It turns out that in both the scenario where
> we saw a hang up on fact insertion and on fireAllRules call, the thread
> dump
> was the same.
>
> The stack looks like:
> ```
> "main" - Thread t@1
>    java.lang.Thread.State: RUNNABLE
>      at java.util.HashMap.getEntry(HashMap.java:347)
>      at java.util.HashMap.containsKey(HashMap.java:335)
>      at
>
> org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:244)
>      at
>
> org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:237)
>      at
>
> org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:88)
>      at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
>      at java.lang.Class.forName0(Native Method)
>      at java.lang.Class.forName(Class.java:247)
>      at
>
> org.mvel2.ParserConfiguration.checkForDynamicImport(ParserConfiguration.java:163)
>      at
> org.mvel2.ParserConfiguration.hasImport(ParserConfiguration.java:191)
>      at org.mvel2.ParserContext.hasImport(ParserContext.java:360)
>      at org.mvel2.ParserContext.isVariableVisible(ParserContext.java:715)
>      at
> org.mvel2.compiler.ExpressionCompiler.verify(ExpressionCompiler.java:394)
>      at
> org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:250)
>      at
> org.mvel2.compiler.ExpressionCompiler.compile(ExpressionCompiler.java:62)
>      at org.mvel2.MVEL.compileExpression(MVEL.java:810)
>      at
>
> org.drools.base.mvel.MVELCompilationUnit.compile(MVELCompilationUnit.java:417)
>      at
>
> org.drools.base.mvel.MVELCompilationUnit.getCompiledExpression(MVELCompilationUnit.java:238)
>      at
>
> org.drools.rule.constraint.MvelConstraint.createMvelConditionEvaluator(MvelConstraint.java:224)
>      at
> org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:208)
>      at
>
> org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:175)
>      at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:133)
>      at
>
> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
>      at
>
> org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
>      at
> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:302)
>      at
> org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:254)
>      at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:366)
>      at
> org.drools.common.SimpleBeliefSystem.insert(SimpleBeliefSystem.java:38)
>      at
>
> org.drools.common.TruthMaintenanceSystem.addLogicalDependency(TruthMaintenanceSystem.java:207)
>      at
>
> org.drools.common.TruthMaintenanceSystem.addLogicalDependency(TruthMaintenanceSystem.java:179)
>      at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:247)
>      at
>
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:950)
>      at
>
> org.drools.base.DefaultKnowledgeHelper.insertLogical(DefaultKnowledgeHelper.java:263)
>      at
>
> org.drools.base.DefaultKnowledgeHelper.insertLogical(DefaultKnowledgeHelper.java:228)
>      at
>
> org.drools.base.DefaultKnowledgeHelper.insertLogical(DefaultKnowledgeHelper.java:223)
>      <application-stack>
>      at some.drools.generated.rule.package.Rule_<drools-generated2>
>      at some.drools.generated.rule.package.Rule_<drools-generated1>
>      at
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1282)
>      - locked <656dd9a0> (a org.drools.common.DefaultAgenda)
>      at
> org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1216)
>      - locked <656dd9a0> (a org.drools.common.DefaultAgenda)
>      at
> org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1451)
>      at
>
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:756)
>      at
>
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:718)
>      at
>
> org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)
>      <facts-inserted-previously>
> ```
>
> We were able to get the same hung thread dump prior to fireAllRules.  I
> think the related entry point is during one of the #assertObject calls
> midway through the stack.
> The CompositiveClassLoader$CachingLoader definitely seems to be the issue.
>
> When we found this behavior consistently occurring (although rare), I found
> the option of turning off the use of the caching loader by setting the
> "drools.classLoaderCacheEnabled"="false" option referenced in the
> ClassLoaderCacheOption class.
> With this setting, we have done extensive retries to find this behavior and
> it has vanished.
>
> This CompositiveClassLoader$CachingLoader uses an internal j.u.HashMap that
> is not safe for concurrent access.  I have listed below several related
> posts on the topic.  I'm fairly sure if this used a
> j.u.c.ConcurrentHashMap,
> this hanging thread scenario would not happen.
>
> However, most of the posts I've seen on this subject are from use-cases
> where the application is explicitly doing some sort of multithreaded access
> to the Drools
> KnowledgeBase and/or StatefulKnowledgeSession.
>
> In my case, I do not know of *any* multithreaded actions taking place
> within
> my application around the Drools KnowledgeBase or StatefulKnowledgeSession.
> I am not seeing ConcurrentModificationException though. Instead I'm seeing
> a, seemingly infinite, loop in the j.u.HashMap#getEntry.
>
> Hanging in a "get" method of the j.u.HashMap would suggest to me that there
> is a race condition where sometimes the j.u.HashMap#put on
> the `classLoaderResultMap` field in the
> CompositiveClassLoader$CachingLoader#load method is being executed at the
> same time as another thread is doing the
> j.u.HashMap#getEntry.  If the j.u.HashMap were to resize at this point, it
> could cause an infinite looping behavior.
>
> Does Drools internally use multithreading?  Is there somewhere in the MVEL
> lib or the Janino compiler where it may be concurrently accessing the
> CompositiveClassLoader$CachingLoader$load method?
> I have been digging around a lot and I cannot find what could be the root
> cause of this behavior.
>
>
> I think this relates directly to these:
>
> * http://lists.jboss.org/pipermail/rules-users/2013-July/032446.html
> * http://lists.jboss.org/pipermail/rules-users/2013-July/032446.html
>
> However, I do not see a real resolution to the problem.
>
> I also see several related issues:
>
> * http://lists.jboss.org/pipermail/rules-users/2013-July/032446.html
> * https://issues.jboss.org/browse/JBRULES-3552
>
>
>
>
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/CompositiveClassLoader-CachingLoader-load-method-intermittently-hangs-tp4028780.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to