[jboss-jira] [JBoss JIRA] (DROOLS-336) Property Reactivity fails on phreak
RH Bugzilla Integration (JIRA)
jira-events at lists.jboss.org
Mon Nov 11 10:36:29 EST 2013
[ https://issues.jboss.org/browse/DROOLS-336?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12922399#comment-12922399 ]
RH Bugzilla Integration commented on DROOLS-336:
------------------------------------------------
Mario Fusco <mfusco at redhat.com> made a comment on [bug 1029071|https://bugzilla.redhat.com/show_bug.cgi?id=1029071]
In LeftInputAdapterNode a modifyByPass happens, for a sink that has not been reached before. So it thinks it's new, and thus propagates as an insert
The real bug comes in doInsertObject method. It creates a child LT here, even though once it enters doInsertSegmentMemory the mask intersect fails. This leaves a child LT, that is not propagated. Next time update is called, as the LT is there it thinks it's a modify and propagates as a modify - but it never reached the beta node or the LeftMemory, and thus the memory corruption.
I managed to isolate the problem with the failing test case I am pasting below. Note that if you remove the @PropertyReactive annotation from the Hero class the test becomes green.
@Test
public void testWumpus() {
String drl = "import org.drools.compiler.integrationtests.Misc2Test.Hero;\n" +
"import org.drools.compiler.integrationtests.Misc2Test.StepForwardCommand;\n" +
"import org.drools.compiler.integrationtests.Misc2Test.ChangeDirectionCommand;\n" +
"\n" +
"rule RotateLeft when\n" +
" $h : Hero( goingRight == true )\n" +
" $dc : ChangeDirectionCommand()\n" +
"then\n" +
" retract ( $dc ); \n" +
" modify ( $h ) { setGoingRight( false ) };\n" +
"end\n" +
"\n" +
"rule RotateRight when\n" +
" $h : Hero( goingRight == false )\n" +
" $dc : ChangeDirectionCommand()\n" +
"then\n" +
" retract ( $dc ); \n" +
" modify ( $h ) { setGoingRight( true ) };\n" +
"end\n" +
"\n" +
"rule StepLeft when\n" +
" $h : Hero( goingRight == false )\n" +
" $sc : StepForwardCommand()\n" +
"then\n" +
" retract ( $sc ); \n" +
" modify ( $h ) { setPos( $h.getPos()-1 ) };\n" +
"end\n" +
"\n" +
"rule StepRight when\n" +
" $h : Hero( goingRight == true )\n" +
" $sc : StepForwardCommand()\n" +
"then\n" +
" retract ( $sc );\n" +
" modify ( $h ) { setPos( $h.getPos()+1 ) };\n" +
"end\n";
KnowledgeBuilderConfiguration kbConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
KnowledgeBase kbase = loadKnowledgeBaseFromString( kbConf, drl );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Hero hero = new Hero(1);
ksession.insert(hero);
ksession.fireAllRules();
ksession.insert(new StepForwardCommand());
ksession.fireAllRules();
ksession.insert(new StepForwardCommand());
ksession.fireAllRules();
assertEquals(3, hero.getPos());
ksession.insert(new ChangeDirectionCommand());
ksession.fireAllRules();
ksession.insert(new StepForwardCommand());
ksession.fireAllRules();
assertEquals(2, hero.getPos());
}
@PropertyReactive
public static class Hero {
private int pos = 1;
private boolean goingRight = true;
public Hero(int pos) {
this.pos = pos;
}
public int getPos() {
return pos;
}
public void setPos(int pos) {
this.pos = pos;
}
public boolean isGoingRight() {
return goingRight;
}
public void setGoingRight(boolean goingRight) {
this.goingRight = goingRight;
}
}
public static class ChangeDirectionCommand { }
public static class StepForwardCommand { }
> Property Reactivity fails on phreak
> -----------------------------------
>
> Key: DROOLS-336
> URL: https://issues.jboss.org/browse/DROOLS-336
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Reporter: Mario Fusco
> Assignee: Mario Fusco
>
> In LeftInputAdapterNode a modifyByPass happens, for a sink that has not been reached before. So it thinks it's new, and thus propagates as an insert
> The real bug comes in doInsertObject method. It creates a child LT here, even though once it enters doInsertSegmentMemory the mask intersect fails. This leaves a child LT, that is not propagated. Next time update is called, as the LT is there it thinks it's a modify and propagates as a modify - but it never reached the beta node or the LeftMemory, and thus the memory corruption.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list