You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2009/03/04 00:19:23 UTC

svn commit: r749834 - in /ode/branches/APACHE_ODE_1.X: axis2/src/main/java/org/apache/ode/axis2/ bpel-obj/src/main/java/org/apache/ode/bpel/o/ bpel-runtime/src/main/java/org/apache/ode/bpel/engine/

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;
+	}
+
 }