]
Mario Fusco edited comment on DROOLS-4909 at 1/8/20 4:35 AM:
-------------------------------------------------------------
[~dacr] I just replied to you on DROOLS-4288, I'm pasting my reply below for your
convenience
bq. Sorry if I'm pointing to something already obvious to you, but it is important
that you fully understand the mechanism that prevents this kind of recursion in drools,
see
bq. In the rule you pasted I don't expect any loop because you're modifying the
'value' property of the Scoring object while the pattern matching on that object
doesn't have any constraint referring to that property.
bq. I STRONGLY suggest you to provide a complete reproducer of your problem instead of
using version 7.20 otherwise you'll have a working application only because you're
relying on the side effect of a bug.
The rule you pasted clearly doesn't reproduce the issue and in this condition it's
impossible for me to further investigate this problem. Please provide an actual reproducer
of your problem. Thanks.
was (Author: mfusco):
[~dacr] I just replied to you on DROOLS-4288, I'm pasting my reply below for your
convenience
bq. Sorry if I'm pointing to something already obvious to you, but it is important
that you fully understand the mechanism that prevents this kind of recursion in drools,
see
bq.
bq. In the rule you pasted I don't expect any loop because you're modifying the
'value' property of the Scoring object while the pattern matching on that object
doesn't have any constraint referring to that property.
bq.
bq. I STRONGLY suggest you to provide a complete reproducer of your problem instead of
using version 7.20 otherwise you'll have a working application only because you're
relying on the side effect of a bug.
The rule you pasted clearly doesn't reproduce the issue and in this condition it's
impossible for me to further investigate this problem. Please provide an actual reproducer
of your problem. Thanks.
Infinite recursion in drools after version change from v7.20 to
v7.21
---------------------------------------------------------------------
Key: DROOLS-4909
URL:
https://issues.redhat.com/browse/DROOLS-4909
Project: Drools
Issue Type: Bug
Components: core engine
Affects Versions: 7.21.0.Final, 7.22.0.Final, 7.23.0.Final, 7.25.0.Final,
7.31.0.Final
Environment: Both Mac and Windows
Reporter: Crosson David
Assignee: Mario Fusco
Priority: Major
Attachments: Screen Shot 2019-07-10 at 3.53.10 PM.png, Screen Shot 2019-07-10 at
5.56.32 PM.png, Screen Shot 2019-07-10 at 5.59.28 PM.png, error.png, pojo.png, static.png,
static_error.png
https://issues.redhat.com/browse/DROOLS-4288
The problem is not fully solved, I got a forever loop on my KB since 7.21.0.Final, I
tried with 7.25.0.Final but without success, and the issue is still here with
7.31.0.Final. Will go back to release 7.20.0.Final
(the only fix I can apply is to add no-loop clause to my rules although it shouldn't
be necessary).
I can't share the affected KB, and unfortunately I was unable to reproduce the issue
loop on a smaller example
The affected rule looks like :
{{rule "reset metric to max score when no more issues are present"
//no-loop // TODO - no-loop TO BE REMOVED AS IT SHOULDN'T BE NECESSARY
when
Something($id:identity, $origin:origin)
not Issue($id == identity, $origin == origin, category!="metrics")
$scoring: Scoring(name == "performance", $id == identity, $origin == origin)
then
modify($scoring)
{ setValue(100.0); }
end}}
----
from
https://issues.redhat.com/browse/DROOLS-4288 :
When there is a version change in drools-compiler from `7.20.0.Final` to `7.21.0.Final`
some rules are looping recursively.
*Code in github:*
[The working
version|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.20]
[The recursively looping
version|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.21]
[The change between working and looping
version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
*More details*
When I fire a rule whose `then` part modifies a fact that is already checked in the
`when` part:
{code:java}
rule "rule 1.1"
when
$sampleDomain: SampleDomain(instanceVariable2 == "Value of instance
variable")
then
System.out.println("Rule 1.1 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
{code}
it doesn't loop recursively.
But when I call another rule which call a static function from another class:
{code:java}
rule "rule 1.2"
when
$sampleDomain: SampleDomain(CoreUtils.anotherFunction())
then
System.out.println("Rule 1.2 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
{code}
it loops recursively.
The class with static function is
{code:java}
import com.drool_issue.domain.SampleDomain;
public class CoreUtils {
public static boolean anotherFunction() {
System.out.println("anotherFunction() inside CoreUtils");
return true;
}
public static boolean anotherFunction(SampleDomain sampleDomain) {
System.out.println("anotherFunction(SampleDomain sampleDomain) inside
CoreUtils");
return true;
}
}
{code}
My domain file is:
{code:java}
public class SampleDomain {
private int instanceVariable1;
private String instanceVariable2;
private int instanceVariable3;
public int getInstanceVariable1() {
return instanceVariable1;
}
public void setInstanceVariable1(int instanceVariable1) {
this.instanceVariable1 = instanceVariable1;
}
public String getInstanceVariable2() {
return instanceVariable2;
}
public void setInstanceVariable2(String instanceVariable2) {
this.instanceVariable2 = instanceVariable2;
}
public int getInstanceVariable3() {
return instanceVariable3;
}
public void setInstanceVariable3(int instanceVariable3) {
this.instanceVariable3 = instanceVariable3;
}
}
{code}
This is only caused after version change from `7.20.0.Final` to `7.21.0.Final`. Any
guess on what the problem might be?
When I further looked into the problem I saw this too.
When we add two functions into the `SampleDomain` class ie
{code:java}
public boolean anotherFunction() {
return true;
}
public boolean anotherFunction(SampleDomain sampleDomain) {
return true;
}
{code}
and use this in the rule like:
{code:java}
rule "rule 1.4"
when
$sampleDomain: SampleDomain(anotherFunction())
then
System.out.println("Rule 1.4 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
{code}
and
{code:java}
rule "rule 1.5"
when
$sampleDomain: SampleDomain(anotherFunction($sampleDomain))
then
System.out.println("Rule 1.5 fired");
modify($sampleDomain){
setInstanceVariable3(4)
}
end
{code}
these also loops recursively.
*Code in github:*
[The recursive looping when using non static
methods|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7....]
[The change between working and above
version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
Also when any of the static method is made non static then method from the domain class
is called even though the static method is specified in the rule.
*Code portions to be noted here are:*
[Rule where static method is
called.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b25...]
[Another rule which also call the static
method.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b25...]
[The static access modifier removed from the functions which where previously
static.|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
*Code in github:*
[Weird behaviour when removing static modifier for the
functions.|https://github.com/padippist/DroolsIssueReporting/tree/issue_v...]
[The change between working and above
version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
*All this are caused in versions after `7.20.0.Final`, ie `7.21.0.Final`, `7.22.0.Final`
and `7.23.0.Final`*