Author: karthick
Date: Tue Apr 21 17:26:27 2009
New Revision: 767234

URL: http://svn.apache.org/viewvc?rev=767234&view=rev
Log:
ODE-576 ProcessDaoImpl objects get leaked when using in-memory-processes

Modified:
    
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
    
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/iapi/BpelServer.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
    
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java

Modified: 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java?rev=767234&r1=767233&r2=767234&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
 Tue Apr 21 17:26:27 2009
@@ -544,12 +544,11 @@
 
     private void handleEvent(ProcessStoreEvent pse) {
         __log.debug("Process store event: " + pse);
-        ProcessConf pconf;
+        ProcessConf pconf = _store.getProcessConfiguration(pse.pid);
         switch (pse.type) {
             case ACTVIATED:
                 // bounce the process
                 _bpelServer.unregister(pse.pid);
-                pconf = _store.getProcessConfiguration(pse.pid);
                 if (pconf != null) {
                     _bpelServer.register(pconf);
                 } else {
@@ -564,7 +563,6 @@
                 _bpelServer.unregister(pse.pid);
                 // bounce the process if necessary  
                 if (instantiated) {
-                    pconf = _store.getProcessConfiguration(pse.pid);
                     if (pconf != null) {
                         _bpelServer.register(pconf);
                     } else {
@@ -574,12 +572,17 @@
                 } else {
                     // we may have potentially created a lot of garbage, so,
                     // let's hope the garbage collector is configured properly.
+                       if (pconf != null) {
+                               _bpelServer.cleanupProcess(pconf);
+                       }
                 }
                 break;
             case DISABLED:
             case UNDEPLOYED:
                 _bpelServer.unregister(pse.pid);
-                _bpelServer.cleanupProcess(pse.pid);
+               if (pconf != null) {
+                       _bpelServer.cleanupProcess(pconf);
+               }
                 break;
             default:
                 __log.debug("Ignoring store event: " + pse);

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/iapi/BpelServer.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/iapi/BpelServer.java?rev=767234&r1=767233&r2=767234&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/iapi/BpelServer.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/iapi/BpelServer.java
 Tue Apr 21 17:26:27 2009
@@ -117,7 +117,7 @@
      */
     void unregister(QName pid) throws BpelEngineException;
 
-    void cleanupProcess(QName pid) throws BpelEngineException;
+    void cleanupProcess(ProcessConf conf) throws BpelEngineException;
     
     /**
      * @param pid The process definition QName

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java?rev=767234&r1=767233&r2=767234&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
 Tue Apr 21 17:26:27 2009
@@ -367,10 +367,6 @@
         }
     }
 
-    public void cleanupProcess(QName pid) throws BpelEngineException {
-        deleteProcessDAO(pid);
-    }
-
     /**
      * Register a global message exchange interceptor.
      * @param interceptor message-exchange interceptor
@@ -401,36 +397,45 @@
     }
 
     /* TODO: We need to have a method of cleaning up old deployment data. */
-    protected boolean deleteProcessDAO(final QName pid) {
+    protected boolean deleteProcessDAO(final QName pid, boolean isInMemory) {
         try {
-            return _db.exec(new BpelDatabase.Callable<Boolean>() {
-                public Boolean run(BpelDAOConnection conn) throws Exception {
-                    final ProcessDAO proc = conn.getProcess(pid);
-                    if (proc != null) {
-                        // delete routes
-                        if(__log.isDebugEnabled()) __log.debug("Deleting only 
the process " + pid + "...");
-                        proc.deleteProcessAndRoutes();
-                        if(__log.isInfoEnabled()) __log.info("Deleted only the 
process " + pid + ".");
-                         // we do deferred instance cleanup only for 
hibernate, for now
-                        if( proc instanceof DeferredProcessInstanceCleanable &&
-                            !DEFERRED_PROCESS_INSTANCE_CLEANUP_DISABLED ) {
-                            // schedule deletion of process runtime data
-                            
_engine._contexts.scheduler.scheduleMapSerializableRunnable(
-                                new 
ProcessCleanUpRunnable(((DeferredProcessInstanceCleanable)proc).getId()), new 
Date());
-                        } else if( proc instanceof 
DeferredProcessInstanceCleanable ) {
-                            
((DeferredProcessInstanceCleanable)proc).deleteInstances(Integer.MAX_VALUE);
-                        }
-                        return true;
-                    }
-                    return false;
-                }
-            });
+               if (isInMemory) {
+               return deleteProcessDAO(_contexts.inMemDao.getConnection(), 
pid);
+               } else {
+                   return _db.exec(new BpelDatabase.Callable<Boolean>() {
+                       public Boolean run(BpelDAOConnection conn) throws 
Exception {
+                               return deleteProcessDAO(conn, pid);
+                       }
+                   });
+               }
         } catch (RuntimeException re) {
             throw re;
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
+    
+    private boolean deleteProcessDAO(BpelDAOConnection conn, QName pid) {
+        final ProcessDAO proc = conn.getProcess(pid);
+        if (proc != null) {
+            // delete routes
+            if(__log.isDebugEnabled()) __log.debug("Deleting only the process 
" + pid + "...");
+            proc.deleteProcessAndRoutes();
+            if(__log.isInfoEnabled()) __log.info("Deleted only the process " + 
pid + ".");
+             // we do deferred instance cleanup only for hibernate, for now
+            if( proc instanceof DeferredProcessInstanceCleanable &&
+                !DEFERRED_PROCESS_INSTANCE_CLEANUP_DISABLED ) {
+                // schedule deletion of process runtime data
+                _engine._contexts.scheduler.scheduleMapSerializableRunnable(
+                    new 
ProcessCleanUpRunnable(((DeferredProcessInstanceCleanable)proc).getId()), new 
Date());
+            } else if( proc instanceof DeferredProcessInstanceCleanable ) {
+                
((DeferredProcessInstanceCleanable)proc).deleteInstances(Integer.MAX_VALUE);
+            }
+            return true;
+        }
+        return false;
+       
+    }
 
     public void onScheduledJob(JobInfo jobInfo) throws JobProcessorException {
         getEngine().onScheduledJob(jobInfo);
@@ -646,4 +651,10 @@
             }
         }
     }
+
+       public void cleanupProcess(ProcessConf pconf) throws 
BpelEngineException {
+               if (pconf != null) {
+                       deleteProcessDAO(pconf.getProcessId(), 
pconf.isTransient());
+               }
+       }
 }

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java?rev=767234&r1=767233&r2=767234&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java
 Tue Apr 21 17:26:27 2009
@@ -325,7 +325,6 @@
             du = _deploymentUnits.remove(dir.getName());
             if (du != null) {
                 undeployed = toPids(du.getProcessNames(), du.getVersion());
-                _processes.keySet().removeAll(undeployed);
             }
         } finally {
             _rw.writeLock().unlock();
@@ -335,6 +334,13 @@
             fireEvent(new ProcessStoreEvent(ProcessStoreEvent.Type.UNDEPLOYED, 
pn, du.getName()));
             __log.info(__msgs.msgProcessUndeployed(pn));
         }
+        
+        _rw.writeLock().lock();
+        try {
+            _processes.keySet().removeAll(undeployed);
+        } finally {
+            _rw.writeLock().unlock();
+        }
 
         return undeployed;
     }


Reply via email to