You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/17 12:29:50 UTC

[46/50] [abbrv] incubator-taverna-server git commit: Refactoring the persistence manager so it doesn't use thread-local storage as a cache in a way that I can't clear.

Refactoring the persistence manager so it doesn't use thread-local
storage as a cache in a way that I can't clear.

Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/commit/d13e9a5d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/tree/d13e9a5d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/diff/d13e9a5d

Branch: refs/heads/master
Commit: d13e9a5db14faf71094dc33fbc29e1cfc3d99a03
Parents: 3465ccf
Author: Donal Fellows <do...@manchester.ac.uk>
Authored: Thu Aug 21 11:08:37 2014 +0100
Committer: Donal Fellows <do...@manchester.ac.uk>
Committed: Thu Aug 21 11:08:37 2014 +0100

----------------------------------------------------------------------
 .../master/usage/UsageRecordRecorder.java       |  2 -
 .../taverna/server/master/utils/JDOSupport.java | 76 +++++++++++++++-----
 server-webapp/src/main/webapp/WEB-INF/beans.xml | 15 ++--
 3 files changed, 68 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/d13e9a5d/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
----------------------------------------------------------------------
diff --git a/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java b/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
index 52fe73c..12de304 100644
--- a/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
+++ b/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
@@ -155,10 +155,8 @@ public class UsageRecordRecorder extends JDOSupport<UsageRecord> {
 		return result;
 	}
 
-	@Override
 	@PreDestroy
 	public void close() {
-		super.close();
 		if (writer != null)
 			writer.close();
 	}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/d13e9a5d/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
----------------------------------------------------------------------
diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java b/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
index 9bfe8b4..b9cf1e6 100644
--- a/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
+++ b/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
@@ -9,8 +9,10 @@ import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import static org.apache.commons.logging.LogFactory.getLog;
 
+import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
+import java.util.WeakHashMap;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -37,7 +39,7 @@ import org.springframework.beans.factory.annotation.Required;
  */
 public abstract class JDOSupport<T> {
 	private Class<T> contextClass;
-	PersistenceManager pm;
+	private PersistenceManagerBuilder pmb;
 
 	/**
 	 * Instantiate this class, supplying it a handle to the class that will be
@@ -51,18 +53,19 @@ public abstract class JDOSupport<T> {
 	}
 
 	/**
-	 * @param persistenceManagerFactory
+	 * @param persistenceManagerBuilder
 	 *            The JDO engine to use for managing persistence.
 	 */
 	@Required
-	public void setPersistenceManagerFactory(
-			PersistenceManagerFactory persistenceManagerFactory) {
-		pm = persistenceManagerFactory.getPersistenceManagerProxy();
+	public void setPersistenceManagerBuilder(
+			PersistenceManagerBuilder persistenceManagerBuilder) {
+		pmb = persistenceManagerBuilder;
 	}
 
-	@PreDestroy
-	public void close() {
-		pm.close();
+	private PersistenceManager pm() {
+		if (isPersistent())
+			return pmb.getPersistenceManager();
+		return null;
 	}
 
 	/**
@@ -72,7 +75,7 @@ public abstract class JDOSupport<T> {
 	 * @return Whether there is a persistence manager installed.
 	 */
 	protected boolean isPersistent() {
-		return pm != null;
+		return pmb != null;
 	}
 
 	/**
@@ -84,7 +87,7 @@ public abstract class JDOSupport<T> {
 	 */
 	@Nonnull
 	protected Query query(@Nonnull String filter) {
-		return pm.newQuery(contextClass, filter);
+		return pm().newQuery(contextClass, filter);
 	}
 
 	/**
@@ -98,7 +101,7 @@ public abstract class JDOSupport<T> {
 	 */
 	@Nonnull
 	protected Query namedQuery(@Nonnull String name) {
-		return pm.newNamedQuery(contextClass, name);
+		return pm().newNamedQuery(contextClass, name);
 	}
 
 	/**
@@ -113,7 +116,7 @@ public abstract class JDOSupport<T> {
 	protected T persist(@Nullable T value) {
 		if (value == null)
 			return null;
-		return pm.makePersistent(value);
+		return pm().makePersistent(value);
 	}
 
 	/**
@@ -128,7 +131,7 @@ public abstract class JDOSupport<T> {
 	protected T detach(@Nullable T value) {
 		if (value == null)
 			return null;
-		return pm.detachCopy(value);
+		return pm().detachCopy(value);
 	}
 
 	/**
@@ -141,7 +144,7 @@ public abstract class JDOSupport<T> {
 	@Nullable
 	protected T getById(Object id) {
 		try {
-			return pm.getObjectById(contextClass, id);
+			return pm().getObjectById(contextClass, id);
 		} catch (Exception e) {
 			return null;
 		}
@@ -155,7 +158,7 @@ public abstract class JDOSupport<T> {
 	 */
 	protected void delete(@Nullable T value) {
 		if (value != null)
-			pm.deletePersistent(value);
+			pm().deletePersistent(value);
 	}
 
 	/**
@@ -173,9 +176,9 @@ public abstract class JDOSupport<T> {
 		Object applyTransaction(ProceedingJoinPoint pjp, JDOSupport<?> support)
 				throws Throwable {
 			synchronized (lock) {
+				PersistenceManager pm = support.pm();
 				int id = ++txid;
-				Transaction tx = support.pm == null ? null : support.pm
-						.currentTransaction();
+				Transaction tx = (pm == null) ? null : pm.currentTransaction();
 				if (tx != null && tx.isActive())
 					tx = null;
 				if (tx != null) {
@@ -217,6 +220,45 @@ public abstract class JDOSupport<T> {
 	 */
 	@Target(METHOD)
 	@Retention(RUNTIME)
+	@Documented
 	public @interface WithinSingleTransaction {
 	}
+
+	public static class PersistenceManagerBuilder {
+		private PersistenceManagerFactory pmf;
+		private WeakHashMap<Thread, PersistenceManager> cache = new WeakHashMap<>();
+
+		/**
+		 * @param persistenceManagerFactory
+		 *            The JDO engine to use for managing persistence.
+		 */
+		@Required
+		public void setPersistenceManagerFactory(
+				PersistenceManagerFactory persistenceManagerFactory) {
+			pmf = persistenceManagerFactory;
+		}
+
+		@Nonnull
+		public PersistenceManager getPersistenceManager() {
+			if (cache == null)
+				return pmf.getPersistenceManager();
+			Thread t = Thread.currentThread();
+			PersistenceManager pm = cache.get(t);
+			if (pm == null && pmf != null) {
+				pm = pmf.getPersistenceManager();
+				cache.put(t, pm);
+			}
+			return pm;
+		}
+
+		@PreDestroy
+		void clearThreadCache() {
+			WeakHashMap<Thread, PersistenceManager> cache = this.cache;
+			this.cache = null;
+			for (PersistenceManager pm : cache.values())
+				if (pm != null)
+					pm.close();
+			cache.clear();
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/d13e9a5d/server-webapp/src/main/webapp/WEB-INF/beans.xml
----------------------------------------------------------------------
diff --git a/server-webapp/src/main/webapp/WEB-INF/beans.xml b/server-webapp/src/main/webapp/WEB-INF/beans.xml
index af0d8cf..693557a 100644
--- a/server-webapp/src/main/webapp/WEB-INF/beans.xml
+++ b/server-webapp/src/main/webapp/WEB-INF/beans.xml
@@ -62,7 +62,7 @@
 		<property name="logIncomingWorkflows" value="${default.logworkflows}" />
 		<property name="allowNewWorkflowRuns" value="${default.permitsubmit}" />
 		<property name="logOutgoingExceptions" value="${default.logexceptions}" />
-		<property name="persistenceManagerFactory" ref="pmf" />
+		<property name="persistenceManagerBuilder" ref="pmb" />
 		<property name="self" ref="webapp.state" />
 	</bean>
 
@@ -179,7 +179,7 @@
 	<bean id="passwordEncoder"
 		class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
 	<bean class="org.taverna.server.master.identity.UserStore" id="userStore">
-		<property name="persistenceManagerFactory" ref="pmf" />
+		<property name="persistenceManagerBuilder" ref="pmb" />
 		<property name="baselineUserProperties">
 			<util:properties location="/WEB-INF/security/users.properties" />
 		</property>
@@ -212,6 +212,9 @@
 			</props>
 		</property>
 	</bean>
+	<bean id="pmb" class="org.taverna.server.master.utils.JDOSupport.PersistenceManagerBuilder">
+		<property name="persistenceManagerFactory" ref="pmf" />
+	</bean>
 	<bean id="transactionAspect"
 		class="org.taverna.server.master.utils.JDOSupport.TransactionAspect" />
 
@@ -245,7 +248,7 @@
 	<bean id="usageRecordSink" class="org.taverna.server.master.usage.UsageRecordRecorder">
 		<property name="state" ref="webapp.state" />
 		<property name="contextualizer" ref="contextualizer" />
-		<property name="persistenceManagerFactory" ref="pmf" />
+		<property name="persistenceManagerBuilder" ref="pmb" />
 		<property name="self" ref="usageRecordSink" />
 		<property name="disableDB" value="${usage.disableDB}" />
 		<property name="logFile" value="${usage.logFile}" />
@@ -326,7 +329,7 @@
 				the subprocess to complete its registration.
 			</description>
 		</property>
-		<property name="persistenceManagerFactory" ref="pmf" />
+		<property name="persistenceManagerBuilder" ref="pmb" />
 		<!-- <property name="javaBinary"> <description>The name of the java executable 
 			used to run the server worker. Defaults to the executable used to run the 
 			hosting environment.</description> </property> -->
@@ -388,7 +391,7 @@
 			The implementation of the catalog of workflow runs
 			supported by the localworker run engine.
 		</description>
-		<property name="persistenceManagerFactory" ref="pmf" />
+		<property name="persistenceManagerBuilder" ref="pmb" />
 		<property name="facade" ref="worker.rundb" />
 	</bean>
 	<task:scheduled-tasks scheduler="taskScheduler">
@@ -451,7 +454,7 @@
 
 	<bean id="dispatch.atom" class="org.taverna.server.master.notification.atom.EventDAO">
 		<property name="expiryAgeDays" value="${atom.lifespan}" />
-		<property name="persistenceManagerFactory" ref="pmf" />
+		<property name="persistenceManagerBuilder" ref="pmb" />
 		<property name="uriBuilderFactory" ref="feed" />
 		<property name="self" ref="dispatch.atom" />
 	</bean>