[jboss-jira] [JBoss JIRA] (DROOLS-4909) Infinite recursion in drools after version change from v7.20 to v7.21

Crosson David (Jira) issues at jboss.org
Wed Jan 8 07:02:14 EST 2020


    [ https://issues.redhat.com/browse/DROOLS-4909?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13943617#comment-13943617 ] 

Crosson David commented on DROOLS-4909:
---------------------------------------

I was able to reproduce the issue, by reaching the same level of complexity as for our original KB :

 [^toto.drl] 

> 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, toto.drl
>
>
> 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_7.20...issue_v_7.21]
> *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.20_non_static_methodes]
> [The change between working and above version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.20_non_static_methodes]
> 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/bde2804b250babf11cf5d3cf48640d9e6c88f5b3/src/main/resources/rules/rule1.drl#L21]
> [Another rule which also call the static method.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b250babf11cf5d3cf48640d9e6c88f5b3/src/main/resources/rules/rule1.drl#L32]
> [The static access modifier removed from the functions which where previously static.|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.21_weird_behaviors#diff-4e0f238b1184e2267cb5663b9afeaa6fL7]
> *Code in github:*
> [Weird behaviour when removing static modifier for the functions.|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.21_weird_behaviors]
> [The change between working and above version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.21_weird_behaviors]
> *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`*



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list