Author: karthick
Date: Tue Mar  3 23:19:23 2009
New Revision: 749834

URL: http://svn.apache.org/viewvc?rev=749834&view=rev
Log:
ODE-538 Letting Go Of Retired 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-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
    
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java
    
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
    
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.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=749834&r1=749833&r2=749834&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 Mar  3 23:19:23 2009
@@ -22,7 +22,9 @@
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.Parameter;
 import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.axis2.wsdl.WSDLConstants;
 import org.apache.commons.collections.map.MultiKeyMap;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -36,6 +38,7 @@
 import org.apache.ode.axis2.httpbinding.HttpExternalService;
 import org.apache.ode.bpel.connector.BpelServerConnector;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
+import org.apache.ode.bpel.engine.BpelEngineImpl;
 import org.apache.ode.bpel.engine.BpelServerImpl;
 import org.apache.ode.bpel.engine.CountLRUDehydrationPolicy;
 import org.apache.ode.bpel.extvar.jdbc.JdbcExternalVariableModule;
@@ -75,6 +78,7 @@
 import javax.xml.namespace.QName;
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.util.ArrayList;
 import java.util.StringTokenizer;
 import java.util.Iterator;
 import java.util.concurrent.ExecutorService;
@@ -406,8 +410,24 @@
         __log.debug("Destroying service " + serviceName + " port " + portName);
         ODEService service = (ODEService) _services.remove(serviceName, 
portName);
         if (service != null) {
+            // try to clean up the service after itself
             try {
-                _axisConfig.removeService(service.getAxisService().getName());
+                String axisServiceName = service.getAxisService().getName();
+               AxisService axisService = 
_axisConfig.getService(axisServiceName);
+                // first, de-allocate its schemas
+               axisService.releaseSchemaList();
+                // then, de-allocate its parameters
+                // the service's wsdl object model is stored as one of its 
parameters!
+                // can't stress strongly enough how important it is to clean 
this up.
+               ArrayList<Parameter> parameters = (ArrayList<Parameter>) 
axisService.getParameters();
+               for (Parameter parameter : parameters) {
+                       axisService.removeParameter(parameter);
+               }
+                // now, stop the service
+               _axisConfig.stopService(axisServiceName);
+                // if only this method did a good job of cleaning up after 
itself
+                _axisConfig.removeService(axisServiceName);
+                _axisConfig.cleanup();
             } catch (AxisFault axisFault) {
                 __log.error("Couldn't destroy service " + serviceName);
             }
@@ -632,14 +652,37 @@
 
     private void handleEvent(ProcessStoreEvent pse) {
         __log.debug("Process store event: " + pse);
+        ProcessConf pconf;
         switch (pse.type) {
             case ACTVIATED:
-            case RETIRED:
                 // bounce the process
                 _server.unregister(pse.pid);
-                ProcessConf pconf = _store.getProcessConfiguration(pse.pid);
-                if (pconf != null) _server.register(pconf);
-                else __log.debug("slighly odd: recevied event " + pse + " for 
process not in store!");
+                pconf = _store.getProcessConfiguration(pse.pid);
+                if (pconf != null) {
+                       _server.register(pconf);
+                } else {
+                       __log.debug("slighly odd: recevied event " + 
+                                       pse + " for process not in store!");
+                }
+                break;
+            case RETIRED:
+               // are there are instances of this process running? 
+               boolean instantiated = _server.hasActiveInstances(pse.pid);
+               // remove the process
+                _server.unregister(pse.pid);
+                // bounce the process if necessary  
+                if (instantiated) {
+                       pconf = _store.getProcessConfiguration(pse.pid);
+                       if (pconf != null) {
+                               _server.register(pconf);
+                       } else {
+                               __log.debug("slighly odd: recevied event " + 
+                                               pse + " for process not in 
store!");
+                       }
+                } else {
+                    // we may have potentially created a lot of garbage, so,
+                       // let's hope the garbage collector is configured 
properly.
+                }
                 break;
             case DISABLED:
             case UNDEPLOYED:
@@ -651,6 +694,7 @@
         }
     }
 
+
     // Transactional debugging stuff, to track down all these little annoying 
bugs.
     private class DebugTxMgr implements TransactionManager {
         private TransactionManager _tm;

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
 Tue Mar  3 23:19:23 2009
@@ -62,6 +62,13 @@
         public String toString() {
             return "{OCopy " + to + "=" + from + "}";
         }
+        
+        @Override
+        public void dehydrate() {
+               super.dehydrate();
+               to = null;
+               from = null;
+        }
     }
 
     public interface LValue {
@@ -253,4 +260,12 @@
               return "{PLinkRef " + partnerLink + "!" + isMyEndpointReference 
+ "}";
           }
     }
+    
+    @Override
+    public void dehydrate() {
+       super.dehydrate();
+       for (Copy copy : this.copy) {
+               copy.dehydrate();
+       }
+    }
 }

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java
 Tue Mar  3 23:19:23 2009
@@ -71,4 +71,13 @@
         buf.append(_id);
         return buf.toString();
     }
+    
+    public void dehydrate() {
+       if (debugInfo != null) {
+               debugInfo.description = null;
+               debugInfo.extensibilityElements = null;
+               debugInfo = null;
+       }
+       
+    }
 }

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
 Tue Mar  3 23:19:23 2009
@@ -201,4 +201,19 @@
         in.defaultReadObject();
         instanceCount++;
     }
+    
+    @Override
+    public void dehydrate() {
+       super.dehydrate();
+       procesScope.dehydrate();
+       allPartnerLinks.clear();
+       for (OBase obase : _children) {
+               obase.dehydrate();
+       }
+       _children.clear();
+       messageTypes.clear();
+       elementTypes.clear();
+       xsdTypes.clear();
+       xslSheets.clear();
+    }
 }

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java
 Tue Mar  3 23:19:23 2009
@@ -194,5 +194,35 @@
             return buf.toString();
         }
     }
+    
+    @Override
+    public void dehydrate() {
+       super.dehydrate();
+       this.activity = null;
+       if (compensatable != null) {
+               compensatable.clear();
+       }
+       if (compensationHandler != null) {
+               compensationHandler.dehydrate();
+               compensationHandler = null;
+       }
+       if (terminationHandler != null) {
+               terminationHandler.dehydrate();
+               terminationHandler = null;
+       }
+       if (eventHandler != null) {
+               eventHandler.dehydrate();
+               eventHandler = null;
+       }
+       if (variables != null) {
+               variables.clear();
+       }
+       if (correlationSets != null) {
+               correlationSets.clear();
+       }
+       if (partnerLinks != null) {
+               partnerLinks.clear();
+       }
+    }
 
 }

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
 Tue Mar  3 23:19:23 2009
@@ -235,6 +235,7 @@
 
     BpelProcess unregisterProcess(QName process) {
         BpelProcess p = _activeProcesses.remove(process);
+        __log.debug("Unregister process: serviceId=" + process + ", process=" 
+ p);
         if (p != null) {
             if (__log.isDebugEnabled())
                 __log.debug("Deactivating process " + p.getPID());
@@ -251,7 +252,10 @@
                 }
             }
 
-            p.deactivate();
+            // unregister the services provided by the process
+            p.deactivate();            
+            // release the resources held by this process
+            p.dehydrate();
         }
         return p;
     }
@@ -259,6 +263,10 @@
     boolean isProcessRegistered(QName pid) {
         return _activeProcesses.containsKey(pid);
     }
+    
+    BpelProcess getProcess(QName pid) {
+       return _activeProcesses.get(pid);
+    }
 
     /**
      * Register a process with the engine.

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
 Tue Mar  3 23:19:23 2009
@@ -21,6 +21,7 @@
 import java.io.InputStream;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -847,12 +848,39 @@
         }
 
         private void doDehydrate() {
-            _oprocess = null;
-            _partnerRoles = null;
-            _myRoles = null;
-            _endpointToMyRoleMap = null;
-            _replacementMap = null;
-            _expLangRuntimeRegistry = null;
+               if (_oprocess != null) {
+                       _oprocess.dehydrate();
+                   _oprocess = null;
+               }
+               if (_partnerRoles != null) {
+                   _partnerRoles.clear();
+                   _partnerRoles = null;
+               }
+               if (_myRoles != null) {
+                   _myRoles.clear();
+                   _myRoles = null;
+               }
+               if (_endpointToMyRoleMap != null) {
+                   _endpointToMyRoleMap.clear();
+                   _endpointToMyRoleMap = null;
+               }
+               if (_replacementMap != null) {
+                   _replacementMap = null;
+                   _expLangRuntimeRegistry = null;
+               }
+            _myEprs = null;
+            if (_partnerChannels != null) {
+                   _partnerChannels.clear();
+                   _partnerChannels = null;
+            }
+            if (_partnerEprs != null) {
+                   _partnerEprs.clear();
+                   _partnerEprs = null;
+            }
+            if (_partnerRoles != null) {
+                   _partnerRoles.clear();
+                   _partnerRoles = null;
+            }
         }
 
         private void doHydrate() {
@@ -974,4 +1002,33 @@
         return _pconf;
     }
 
+       public boolean hasActiveInstances() {
+               try {
+                       _hydrationLatch.latch(1);
+            if (isInMemory() || _engine._contexts.scheduler.isTransacted()) { 
+                       return hasActiveInstances(getProcessDAO());
+            } else {
+                // If we do not have a transaction we need to create one. 
+                try {
+                    return (Boolean) 
_engine._contexts.scheduler.execTransaction(new Callable<Object>() {
+                        public Object call() throws Exception {
+                                       return 
hasActiveInstances(getProcessDAO());
+                        }
+                    });
+                } catch (Exception e) {
+                    String errmsg = "DbError";
+                    __log.error(errmsg, e);
+                    return false;
+                }
+            }
+               } finally {
+                       _hydrationLatch.release(1);
+               }
+       }
+       
+       private boolean hasActiveInstances(ProcessDAO processDAO) {
+       Collection<ProcessInstanceDAO> activeInstances = 
processDAO.getActiveInstances();
+               return (activeInstances != null && activeInstances.size() > 0);
+       }
+
 }

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=749834&r1=749833&r2=749834&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 Mar  3 23:19:23 2009
@@ -19,6 +19,7 @@
 package org.apache.ode.bpel.engine;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Properties;
@@ -33,6 +34,7 @@
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
 import org.apache.ode.bpel.dao.ProcessDAO;
+import org.apache.ode.bpel.dao.ProcessInstanceDAO;
 import org.apache.ode.bpel.evt.BpelEvent;
 import org.apache.ode.bpel.iapi.BindingContext;
 import org.apache.ode.bpel.iapi.BpelEngine;
@@ -467,4 +469,10 @@
     public DebuggerContext getDebugger(QName pid) throws BpelEngineException {
        return _engine._activeProcesses.get(pid)._debugger;
     }
+
+       public boolean hasActiveInstances(QName pid) {
+               BpelProcess process = _engine.getProcess(pid);
+               return process != null ? process.hasActiveInstances() : false;
+       }
+
 }


Reply via email to