[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