[jboss-svn-commits] JBL Code SVN: r26511 - in labs/jbossrules/trunk: drools-compiler/src/test/resources/org/drools/integrationtests and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed May 13 13:29:41 EDT 2009
Author: tirelli
Date: 2009-05-13 13:29:41 -0400 (Wed, 13 May 2009)
New Revision: 26511
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_QueryMemoryLeak.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
Log:
JBRULES-2091: fixing memory leak on queries
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2009-05-13 17:20:04 UTC (rev 26510)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2009-05-13 17:29:41 UTC (rev 26511)
@@ -57,7 +57,6 @@
import org.drools.IndexedNumber;
import org.drools.InsertedObject;
import org.drools.KnowledgeBase;
-import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
import org.drools.Message;
import org.drools.MockPersistentSet;
@@ -86,10 +85,13 @@
import org.drools.StatelessSession;
import org.drools.TestParam;
import org.drools.Win;
+import org.drools.Worker;
import org.drools.WorkingMemory;
import org.drools.Cheesery.Maturity;
import org.drools.audit.WorkingMemoryFileLogger;
import org.drools.audit.WorkingMemoryInMemoryLogger;
+import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
@@ -100,6 +102,7 @@
import org.drools.common.DefaultFactHandle;
import org.drools.common.DisconnectedFactHandle;
import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
import org.drools.compiler.DescrBuildError;
import org.drools.compiler.DrlParser;
import org.drools.compiler.DroolsError;
@@ -108,7 +111,6 @@
import org.drools.compiler.PackageBuilderConfiguration;
import org.drools.compiler.ParserError;
import org.drools.compiler.PackageBuilder.PackageMergeException;
-import org.drools.conf.SequentialOption;
import org.drools.definition.KnowledgePackage;
import org.drools.definition.type.FactType;
import org.drools.event.ActivationCancelledEvent;
@@ -132,20 +134,23 @@
import org.drools.lang.descr.PackageDescr;
import org.drools.lang.descr.RuleDescr;
import org.drools.marshalling.MarshallerFactory;
+import org.drools.reteoo.EntryPointNode;
+import org.drools.reteoo.ObjectTypeNode;
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.rule.InvalidRulePackage;
import org.drools.rule.Package;
import org.drools.rule.builder.dialect.java.JavaDialectConfiguration;
import org.drools.runtime.Globals;
import org.drools.runtime.StatefulKnowledgeSession;
-import org.drools.runtime.StatelessKnowledgeSession;
import org.drools.runtime.rule.impl.FlatQueryResults;
import org.drools.spi.ConsequenceExceptionHandler;
import org.drools.spi.GlobalResolver;
+import org.drools.spi.ObjectType;
+import org.drools.util.Entry;
+import org.drools.util.ObjectHashSet;
+import org.drools.util.ObjectHashMap.ObjectEntry;
import org.drools.xml.XmlDumper;
-import com.thoughtworks.xstream.MarshallingStrategy;
-
/** Run all the tests with the ReteOO engine implementation */
public class MiscTest extends TestCase {
@@ -6376,33 +6381,33 @@
}
public void testListOfMaps(){
- KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
- kbuilder.add(ResourceFactory.newClassPathResource("test_TestMapVariableRef.drl", getClass()), ResourceType.DRL);
- KnowledgeBuilderErrors errors = kbuilder.getErrors();
- if (errors.size() > 0) {
- for (KnowledgeBuilderError error: errors) {
- System.err.println(error);
- }
- throw new IllegalArgumentException("Could not parse knowledge.");
- }
- KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
- kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
- StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
- List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
-
- Map mapOne = new HashMap<String,Object>();
- Map mapTwo = new HashMap<String,Object>();
-
- mapOne.put("MSG", "testMessage");
- mapTwo.put("MSGTWO", "testMessage");
-
- list.add(mapOne);
- list.add(mapTwo);
- ksession.insert(list);
- ksession.fireAllRules();
-
- assertEquals(3, list.size());
-
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add(ResourceFactory.newClassPathResource("test_TestMapVariableRef.drl", getClass()), ResourceType.DRL);
+ KnowledgeBuilderErrors errors = kbuilder.getErrors();
+ if (errors.size() > 0) {
+ for (KnowledgeBuilderError error: errors) {
+ System.err.println(error);
+ }
+ throw new IllegalArgumentException("Could not parse knowledge.");
+ }
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
+
+ Map mapOne = new HashMap<String,Object>();
+ Map mapTwo = new HashMap<String,Object>();
+
+ mapOne.put("MSG", "testMessage");
+ mapTwo.put("MSGTWO", "testMessage");
+
+ list.add(mapOne);
+ list.add(mapTwo);
+ ksession.insert(list);
+ ksession.fireAllRules();
+
+ assertEquals(3, list.size());
+
}
public void testKnowledgeContextMVEL() {
@@ -6509,4 +6514,72 @@
}
+ public void testDroolsQueryCleanup() {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_QueryMemoryLeak.drl",
+ getClass() ),
+ ResourceType.DRL );
+ KnowledgeBuilderErrors errors = kbuilder.getErrors();
+ if ( errors.size() > 0 ) {
+ for ( KnowledgeBuilderError error : errors ) {
+ System.err.println( error );
+ }
+ throw new IllegalArgumentException( "Could not parse knowledge." );
+ }
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ String workerId = "B1234";
+ Worker worker = new Worker();
+ worker.setId(workerId);
+
+ org.drools.runtime.rule.FactHandle handle = ksession.insert(worker);
+ ksession.fireAllRules();
+
+ assertNotNull(handle);
+
+ Object retractedWorker = null;
+ for(int i = 0; i < 100; i++) {
+ retractedWorker = (Object)ksession.getQueryResults("getWorker", new Object[] {workerId});
+ }
+
+ assertNotNull(retractedWorker);
+
+ StatefulKnowledgeSessionImpl sessionImpl = (StatefulKnowledgeSessionImpl)ksession;
+
+ ReteooWorkingMemory reteWorkingMemory = sessionImpl.session;
+ AbstractWorkingMemory abstractWorkingMemory = (AbstractWorkingMemory)reteWorkingMemory;
+
+ InternalRuleBase ruleBase = (InternalRuleBase)abstractWorkingMemory.getRuleBase();
+ Collection<EntryPointNode> entryPointNodes = ruleBase.getRete().getEntryPointNodes().values();
+
+ EntryPointNode defaultEntryPointNode = null;
+ for(EntryPointNode epNode : entryPointNodes) {
+ if(epNode.getEntryPoint().getEntryPointId() == "DEFAULT") {
+ defaultEntryPointNode = epNode;
+ break;
+ }
+ }
+ assertNotNull(defaultEntryPointNode);
+
+ Map<ObjectType, ObjectTypeNode> obnodes = defaultEntryPointNode.getObjectTypeNodes();
+
+ ObjectType key = new ClassObjectType(DroolsQuery.class);
+ ObjectTypeNode droolsQueryNode = obnodes.get(key);
+ ObjectHashSet droolsQueryMemory = (ObjectHashSet)abstractWorkingMemory.getNodeMemory(droolsQueryNode);
+ assertEquals(0, droolsQueryMemory.size());
+
+ Entry[] entries = droolsQueryMemory.getTable();
+ int entryCounter = 0;
+ for(Entry entry : entries) {
+ if (entry != null) {
+ entryCounter++;
+ ObjectEntry oEntry = (ObjectEntry)entry;
+ DefaultFactHandle factHandle = (DefaultFactHandle)oEntry.getValue();
+ assertNull(factHandle.getObject());
+ }
+ }
+ }
+
}
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_QueryMemoryLeak.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_QueryMemoryLeak.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_QueryMemoryLeak.drl 2009-05-13 17:29:41 UTC (rev 26511)
@@ -0,0 +1,10 @@
+#created on: May 11, 2009
+package org.drools
+
+query getWorker(String _id)
+ queryResult : Worker(id == _id)
+end
+
+query getWorkers()
+ queryResult : Worker()
+end
\ No newline at end of file
Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_QueryMemoryLeak.drl
___________________________________________________________________
Name: svn:executable
+ *
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java 2009-05-13 17:20:04 UTC (rev 26510)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java 2009-05-13 17:29:41 UTC (rev 26511)
@@ -96,6 +96,9 @@
public static final ValueType EVENT_TYPE = new ValueType( "Event",
EventFactHandle.class,
SimpleValueType.OBJECT );
+ public static final ValueType QUERY_TYPE = new ValueType( "Query",
+ DroolsQuery.class,
+ SimpleValueType.OBJECT );
private String name;
private Class<?> classType;
@@ -156,6 +159,8 @@
}
if ( clazz == FactTemplate.class ) {
return ValueType.FACTTEMPLATE_TYPE;
+ } else if ( clazz == DroolsQuery.class ) {
+ return ValueType.QUERY_TYPE;
} else if ( clazz == Character.TYPE ) {
return ValueType.PCHAR_TYPE;
} else if ( clazz == Byte.TYPE ) {
@@ -202,7 +207,7 @@
return ValueType.STRING_TYPE;
} else if ( clazz == EventFactHandle.class ) {
return ValueType.EVENT_TYPE;
- } else if ( clazz instanceof Object ) {
+ } else if ( Object.class.isAssignableFrom( clazz ) ) {
return ValueType.OBJECT_TYPE;
}
throw new RuntimeDroolsException( "unable to determine ValueType for Class [" + clazz + "]" );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2009-05-13 17:20:04 UTC (rev 26510)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2009-05-13 17:29:41 UTC (rev 26511)
@@ -23,6 +23,7 @@
import org.drools.RuleBaseConfiguration;
import org.drools.base.ClassObjectType;
+import org.drools.base.ValueType;
import org.drools.common.AbstractRuleBase;
import org.drools.common.BaseNode;
import org.drools.common.DroolsObjectInputStream;
@@ -422,11 +423,14 @@
public void setExpirationOffset(long expirationOffset) {
this.expirationOffset = expirationOffset;
- if ( this.expirationOffset > 0 || this.expirationOffset == -1 ) {
- // override memory enabled settings
- this.setObjectMemoryEnabled( true );
- } else {
- this.setObjectMemoryEnabled( false );
+ if( ! this.objectType.getValueType().equals( ValueType.QUERY_TYPE ) ) {
+ if ( this.expirationOffset > 0 ) {
+ // override memory enabled settings
+ this.setObjectMemoryEnabled( true );
+ } else if( this.expirationOffset == 0 ) {
+ // disable memory
+ this.setObjectMemoryEnabled( false );
+ }
}
}
More information about the jboss-svn-commits
mailing list