Skip to content

Commit

Permalink
[BZ-1056599] when deleting a staged insert RightTuple avoid to add it…
Browse files Browse the repository at this point in the history
… to the staged delete set
  • Loading branch information
mariofusco committed Jan 22, 2014
1 parent bf6e02d commit 453f0f6
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 3 deletions.
Expand Up @@ -30,8 +30,17 @@
import org.drools.core.ClassObjectFilter;
import org.drools.core.RuleBaseConfiguration;
import org.drools.core.common.DefaultFactHandle;
import org.drools.core.common.InternalRuleBase;
import org.drools.core.common.InternalWorkingMemory;
import org.drools.core.common.Memory;
import org.drools.core.common.RightTupleSets;
import org.drools.core.conflict.SalienceConflictResolver;
import org.drools.core.impl.StatefulKnowledgeSessionImpl;
import org.drools.core.io.impl.ByteArrayResource;
import org.drools.core.reteoo.BetaMemory;
import org.drools.core.reteoo.JoinNode;
import org.drools.core.reteoo.Rete;
import org.drools.core.reteoo.ReteooRuleBase;
import org.drools.core.util.FileManager;
import org.drools.core.impl.KnowledgeBaseImpl;
import org.drools.core.reteoo.LeftTuple;
Expand Down Expand Up @@ -4957,5 +4966,53 @@ public void testPackagingJarWithTypeDeclarations() throws Exception {
ksession.insert(new Message("Hello World"));
ksession.fireAllRules();
}
}

@Test
public void testStagedTupleLeak() throws Exception {
// BZ-1056599
String str =
"rule R1 when\n" +
" $i : Integer()\n" +
"then\n" +
" insertLogical( $i.toString() );\n" +
"end\n" +
"\n" +
"rule R2 when\n" +
" $i : Integer()\n" +
"then\n" +
" delete( $i );\n" +
"end\n" +
"\n" +
"rule R3 when\n" +
" $l : Long()\n" +
" $s : String( this == $l.toString() )\n" +
"then\n" +
"end\n";

KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

for (int i = 0; i < 10; i++) {
ksession.insert(i);
ksession.fireAllRules();
}

Rete rete = ((InternalRuleBase)((KnowledgeBaseImpl)kbase).ruleBase).getRete();
JoinNode joinNode = null;
for (ObjectTypeNode otn : rete.getObjectTypeNodes()) {
if ( String.class == otn.getObjectType().getValueType().getClassType() ) {
joinNode = (JoinNode)otn.getSinkPropagator().getSinks()[0];
break;
}
}

assertNotNull(joinNode);
InternalWorkingMemory wm = ((StatefulKnowledgeSessionImpl)ksession).session;
BetaMemory memory = (BetaMemory)wm.getNodeMemory(joinNode);
RightTupleSets stagedRightTuples = memory.getStagedRightTuples();
assertEquals(0, stagedRightTuples.deleteSize());
assertNull(stagedRightTuples.getDeleteFirst());
assertEquals(0, stagedRightTuples.insertSize());
assertNull(stagedRightTuples.getInsertFirst());
}
}
Expand Up @@ -57,7 +57,7 @@ public int insertSize() {
}

public int deleteSize() {
return this.insertSize;
return this.deleteSize;
}

public int updateSize() {
Expand All @@ -81,7 +81,7 @@ public boolean addDelete(RightTuple rightTuple) {
// handle clash with already staged entries
case LeftTuple.INSERT:
removeInsert( rightTuple );
break;
return deleteSize == 0;
case LeftTuple.UPDATE:
removeUpdate( rightTuple );
break;
Expand Down Expand Up @@ -133,6 +133,7 @@ public void removeInsert(RightTuple rightTuple) {
previous.setStagedNext( next );
}
rightTuple.clearStaged();
insertSize--;
}

public void removeDelete(RightTuple rightTuple) {
Expand All @@ -153,6 +154,7 @@ public void removeDelete(RightTuple rightTuple) {

}
rightTuple.clearStaged();
deleteSize--;
}

public void removeUpdate(RightTuple rightTuple) {
Expand All @@ -172,6 +174,7 @@ public void removeUpdate(RightTuple rightTuple) {
previous.setStagedNext( next );
}
rightTuple.clearStaged();
updateSize--;
}

public void addAllInserts(RightTupleSets tupleSets) {
Expand Down

0 comments on commit 453f0f6

Please sign in to comment.