-
Bug
-
Resolution: Done
-
Major
-
7.9.0.GA
-
This issue is reproducible on RHDM 7.9.0 + RHDM-1777 one-off patch.
-
False
-
False
-
-
-
-
-
-
CR2
-
?
-
Undefined
-
-
When we build a rule written in MVEL dialect like (*1) with executable model disabled and run the rule using the test code like (*2), MVEL syntax error like (*e1) or (*e2) sometimes occurs though the rule normally does not cause errors. The test code simultaneously executes multiple jobs each of which creates a new KieSession, inserts objects and calls fireAllRules.
This issue is similar to RHDM-1629 in the way that it occurs inside MvelConstraint#evaluate from the stack trace of the exception (*e1) and (*e2). However, from (*e1-1) and (*e2-1), it seems that this is the case which has not been covered by the fixes for RHDM-1629 and RHDM-1764.
(*1)
package com.example.reproducer
import static com.example.reproducer.Utils.TOSTRING
dialect "mvel"
rule "rule_mt_3d"
when
$bus1 : Bus()
$bus2 : Bus( $check: "GAMMA RAY",
$title: "POWER PLANT",
$bus1.karaoke.dvd[$title] != null,
TOSTRING($bus1.karaoke.dvd[$title].artist) >= "01",
TOSTRING($bus1.karaoke.dvd[$title].artist) <= "39" )
then
end
(*2) Test code (In the actual code in the reproducer, java.util.concurrent.CountDownLatch is used for making reproducibility higher.)
KieServices kServices = KieServices.Factory.get();
KieContainer kContainer = kServices.getKieClasspathContainer();
int THREADS = 32;
int REQUESTS = 32;
// 1st run
KieSession kSession1 = kContainer.newKieSession();
Bus bus1 = new Bus("red", 30);
bus1.getKaraoke().getDvd().put("POWER PLANT", new Album("POWER PLANT", "00")); // not match the 1st condition -> short circuit
bus1.getKaraoke().getDvd().put("Somewhere Out In Space", new Album("Somewhere Out In Space", "GAMMA RAY"));
kSession1.insert(bus1);
kSession1.fireAllRules();
kSession1.dispose();
ExecutorService executor = Executors.newFixedThreadPool(THREADS);
System.out.println("***** start threads");
for (int i = 0; i < REQUESTS; i++) {
executor.execute(new Runnable() {
public void run() {
KieSession kSession = kContainer.newKieSession();
Bus bus1 = new Bus("red", 30);
bus1.getKaraoke().getDvd().put("POWER PLANT", new Album("POWER PLANT", "10")); // match the 1st & 2nd condition
bus1.getKaraoke().getDvd().put("Somewhere Out In Space", new Album("Somewhere Out In Space", "GAMMA RAY"));
kSession.insert(bus1);
try {
kSession.fireAllRules();
} catch (Exception e) {
e.printStackTrace();
} finally {
kSession.dispose();
}
}
});
}
(*e1)
org.drools.core.rule.constraint.ConstraintEvaluationException: Error evaluating constraint '$bus1.karaoke.dvd[$title] != null && TOSTRING($bus1.karaoke.dvd[$title].artist) >= "01" && TOSTRING($bus1.karaoke.dvd[$title].artist) <= "39"' in [Rule "rule_mt_3d" in /work2/testdir/reproducer_mt_3d/target/classes/com/example/reproducer/Sample.drl]
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:310)
at org.drools.core.rule.constraint.MvelConstraint.isAllowedCachedLeft(MvelConstraint.java:239)
at org.drools.core.common.SingleBetaConstraints.isAllowedCachedLeft(SingleBetaConstraints.java:135)
at org.drools.core.phreak.PhreakJoinNode.doLeftInserts(PhreakJoinNode.java:108)
at org.drools.core.phreak.PhreakJoinNode.doNode(PhreakJoinNode.java:71)
at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:568)
at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:554)
at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:381)
at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:341)
at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:177)
at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:135)
at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:213)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:88)
at org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(AbstractRuleEvaluator.java:33)
at org.drools.core.concurrent.SequentialRuleEvaluator.evaluateAndFire(SequentialRuleEvaluator.java:43)
at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1111)
at org.drools.core.common.DefaultAgenda.internalFireAllRules(DefaultAgenda.java:1058)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1050)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1345)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1336)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1320)
at com.example.reproducer.DroolsTest$1.run(DroolsTest.java:61)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: [Error: unable to resolve method using strict-mode: java.lang.Object.artist()]
[Near : {... karaoke.dvd[$title].artist) >= "01" && TOSTRING($b ....}]
^
[Line: 1, Column: 73]
at org.mvel2.compiler.PropertyVerifier.getMethod(PropertyVerifier.java:581)
at org.mvel2.compiler.PropertyVerifier.getBeanProperty(PropertyVerifier.java:295)
at org.mvel2.compiler.PropertyVerifier.analyze(PropertyVerifier.java:133)
at org.mvel2.compiler.ExpressionCompiler.verify(ExpressionCompiler.java:399)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:281)
at org.mvel2.util.ParseTools.subCompileExpression(ParseTools.java:2112)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:969)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:400)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:167)
at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:139)
at org.mvel2.ast.And.getReducedValueAccelerated(And.java:35)
at org.mvel2.ast.And.getReducedValueAccelerated(And.java:35)
at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
at org.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123)
at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119)
at org.mvel2.MVEL.executeExpression(MVEL.java:945)
at org.kie.soup.project.datamodel.commons.util.RawMVELEvaluator.executeExpression(RawMVELEvaluator.java:103)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:113) <---------- (\*e1-1)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:89)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:308)
... 24 more
(*e2)
org.drools.core.rule.constraint.ConstraintEvaluationException: Error evaluating constraint '$bus1.karaoke.dvd[$title] != null && TOSTRING($bus1.karaoke.dvd[$title].artist) >= "01" && TOSTRING($bus1.karaoke.dvd[$title].artist) <= "39"' in [Rule "rule_mt_3d" in /work2/testdir/reproducer_mt_3d/target/classes/com/example/reproducer/Sample.drl]
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:310)
at org.drools.core.rule.constraint.MvelConstraint.isAllowedCachedLeft(MvelConstraint.java:239)
at org.drools.core.common.SingleBetaConstraints.isAllowedCachedLeft(SingleBetaConstraints.java:135)
at org.drools.core.phreak.PhreakJoinNode.doLeftInserts(PhreakJoinNode.java:108)
at org.drools.core.phreak.PhreakJoinNode.doNode(PhreakJoinNode.java:71)
at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:568)
at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:554)
at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:381)
at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:341)
at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:177)
at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:135)
at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:213)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:88)
at org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(AbstractRuleEvaluator.java:33)
at org.drools.core.concurrent.SequentialRuleEvaluator.evaluateAndFire(SequentialRuleEvaluator.java:43)
at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1111)
at org.drools.core.common.DefaultAgenda.internalFireAllRules(DefaultAgenda.java:1058)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1050)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1345)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1336)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1320)
at com.example.reproducer.DroolsTest$1.run(DroolsTest.java:65)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: [Error: not a statement, or badly formed structure]
[Near : {... != null && TOSTRING($bus1.karaoke.dvd[$title].arti ....}]
^
[Line: 1, Column: 47]
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:311)
at org.mvel2.util.ParseTools.subCompileExpression(ParseTools.java:2112)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:969)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:400)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:167)
at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:139)
at org.mvel2.ast.And.getReducedValueAccelerated(And.java:35)
at org.mvel2.ast.And.getReducedValueAccelerated(And.java:35)
at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
at org.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123)
at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119)
at org.mvel2.MVEL.executeExpression(MVEL.java:945)
at org.kie.soup.project.datamodel.commons.util.RawMVELEvaluator.executeExpression(RawMVELEvaluator.java:103)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:113) <---------- (\*e2-1)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:89)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:308)
... 24 more
Caused by: java.lang.NullPointerException
at org.mvel2.compiler.PropertyVerifier.getCollectionProperty(PropertyVerifier.java:403)
at org.mvel2.compiler.PropertyVerifier.analyze(PropertyVerifier.java:139)
at org.mvel2.compiler.ExpressionCompiler.verify(ExpressionCompiler.java:399)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:281)
... 41 more
- incorporates
-
DROOLS-6498 Mvel optimization concurrency issue
-
- Closed
-