You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by rw...@apache.org on 2009/03/22 08:21:56 UTC
svn commit: r757138 - in /portals/jetspeed-2/portal/trunk:
components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/page/impl/
components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/util/interceptors/
components/jetspeed-page-mana...
Author: rwatler
Date: Sun Mar 22 07:21:55 2009
New Revision: 757138
URL: http://svn.apache.org/viewvc?rev=757138&view=rev
Log:
correct DBPM deadlock on addListener/clearTransaction
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/page/impl/DatabasePageManagerCache.java
portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/util/interceptors/PageManagerInterceptor.java
portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/resources/database-page-manager-base.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/page-manager.xml
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/page/impl/DatabasePageManagerCache.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/page/impl/DatabasePageManagerCache.java?rev=757138&r1=757137&r2=757138&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/page/impl/DatabasePageManagerCache.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/page/impl/DatabasePageManagerCache.java Sun Mar 22 07:21:55 2009
@@ -489,7 +489,7 @@
/**
* Clear transactions registered with current thread.
*/
- public synchronized static void clearTransactions()
+ public static void clearTransactions()
{
transactionedOperations.remove();
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/util/interceptors/PageManagerInterceptor.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/util/interceptors/PageManagerInterceptor.java?rev=757138&r1=757137&r2=757138&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/util/interceptors/PageManagerInterceptor.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/main/java/org/apache/jetspeed/util/interceptors/PageManagerInterceptor.java Sun Mar 22 07:21:55 2009
@@ -16,6 +16,9 @@
*/
package org.apache.jetspeed.util.interceptors;
+import java.util.ArrayList;
+import java.util.List;
+
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.jetspeed.page.impl.DatabasePageManagerCache;
@@ -27,28 +30,80 @@
*/
public class PageManagerInterceptor implements MethodInterceptor
{
-
/** Serialization version identifier */
private static final long serialVersionUID = -1316279974504594833L;
-
+
+ private final String[] cacheTransactionMethodsPrefix;
+ private final String[] cacheTransactionMethods;
+
+ public PageManagerInterceptor(List<String> cacheTransactionMethods)
+ {
+ List<String> cacheTransactionMethodsPrefixList = new ArrayList<String>();
+ List<String> cacheTransactionMethodsList = new ArrayList<String>();
+ for (String cacheTransactionMethod : cacheTransactionMethods)
+ {
+ if (cacheTransactionMethod.endsWith("*"))
+ {
+ cacheTransactionMethodsPrefixList.add(cacheTransactionMethod.substring(0,cacheTransactionMethod.length()-1));
+ }
+ else
+ {
+ cacheTransactionMethodsPrefixList.add(cacheTransactionMethod);
+ }
+ }
+ this.cacheTransactionMethodsPrefix = cacheTransactionMethodsPrefixList.toArray(new String[cacheTransactionMethodsPrefixList.size()]);
+ this.cacheTransactionMethods = cacheTransactionMethodsList.toArray(new String[cacheTransactionMethodsList.size()]);
+ }
+
/**
* Encloses <code>super.invoke()</code> in a try/catch block, where the
* catch block contains additional retry logic.
*/
public Object invoke(MethodInvocation invocation) throws Throwable
{
+ // filter DBPM cache transactional processing by method name
+ String methodName = invocation.getMethod().getName();
+ boolean performCacheTransactionProcessing = false;
+ for (String cacheTransactionMethodPrefix : cacheTransactionMethodsPrefix)
+ {
+ if (methodName.startsWith(cacheTransactionMethodPrefix))
+ {
+ performCacheTransactionProcessing = true;
+ break;
+ }
+ }
+ if (!performCacheTransactionProcessing)
+ {
+ for (String cacheTransactionMethod : cacheTransactionMethods)
+ {
+ if (methodName.equals(cacheTransactionMethod))
+ {
+ performCacheTransactionProcessing = true;
+ break;
+ }
+ }
+ }
+ // invoke DBPM entry point
try
{
return invocation.proceed();
}
catch (Exception exp)
{
- DatabasePageManagerCache.rollbackTransactions();
+ // rollback cache transactions
+ if (performCacheTransactionProcessing)
+ {
+ DatabasePageManagerCache.rollbackTransactions();
+ }
throw exp;
}
finally
{
- DatabasePageManagerCache.clearTransactions();
+ // clear cache transaction tracking
+ if (performCacheTransactionProcessing)
+ {
+ DatabasePageManagerCache.clearTransactions();
+ }
}
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/resources/database-page-manager-base.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/resources/database-page-manager-base.xml?rev=757138&r1=757137&r2=757138&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/resources/database-page-manager-base.xml (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/resources/database-page-manager-base.xml Sun Mar 22 07:21:55 2009
@@ -49,6 +49,17 @@
<!-- Transaction Proxying -->
<bean id="pageManagerInterceptor" class="org.apache.jetspeed.util.interceptors.PageManagerInterceptor">
+ <!--
+ set cache transaction method name patterns for methods that
+ directly or indirectly add cache transactions so that they
+ can properly rollback and cleanup thread local storage
+ -->
+ <constructor-arg>
+ <list>
+ <value>update*</value>
+ <value>addPages</value>
+ </list>
+ </constructor-arg>
</bean>
<bean id="pageManager" parent="baseTransactionProxy">
@@ -60,6 +71,11 @@
</property>
<property name="transactionAttributes">
<props>
+ <!--
+ note: set cache transaction method name patterns in pageManagerInterceptor
+ for methods that directly or indirectly add cache transactions so that
+ they can properly rollback and cleanup thread local storage
+ -->
<prop key="getPage*">PROPAGATION_SUPPORTS</prop>
<prop key="getLink*">PROPAGATION_SUPPORTS</prop>
<prop key="getFolder*">PROPAGATION_SUPPORTS</prop>
Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/page-manager.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/page-manager.xml?rev=757138&r1=757137&r2=757138&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/page-manager.xml (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/page-manager.xml Sun Mar 22 07:21:55 2009
@@ -183,6 +183,11 @@
</property>
<property name="transactionAttributes">
<props>
+ <!--
+ note: set cache transaction method name patterns in pageManagerInterceptor
+ for methods that directly or indirectly add cache transactions so that
+ they can properly rollback and cleanup thread local storage
+ -->
<prop key="*">PROPAGATION_REQUIRED</prop>
<prop key="getPage*">PROPAGATION_SUPPORTS</prop>
<prop key="getLink*">PROPAGATION_SUPPORTS</prop>
@@ -195,9 +200,7 @@
<prop key="removeFolder">PROPAGATION_REQUIRED,-org.apache.jetspeed.page.document.NodeException</prop>
<prop key="removeLink">PROPAGATION_REQUIRED,-org.apache.jetspeed.page.document.NodeException</prop>
<prop key="removePageSecurity">PROPAGATION_REQUIRED,-org.apache.jetspeed.page.document.NodeException</prop>
- <prop key="createUserHomePagesFromRoles">
- PROPAGATION_REQUIRED,-org.apache.jetspeed.page.document.NodeException
- </prop>
+ <prop key="createUserHomePagesFromRoles">PROPAGATION_REQUIRED,-org.apache.jetspeed.page.document.NodeException</prop>
<prop key="deepCopy*">PROPAGATION_REQUIRED,-org.apache.jetspeed.page.document.NodeException</prop>
<prop key="addPages">PROPAGATION_REQUIRED,-org.apache.jetspeed.page.document.NodeException</prop>
<prop key="folderExists">PROPAGATION_SUPPORTS</prop>
@@ -209,7 +212,19 @@
</property>
<property name="preInterceptors">
<list>
- <bean class="org.apache.jetspeed.util.interceptors.PageManagerInterceptor" />
+ <bean class="org.apache.jetspeed.util.interceptors.PageManagerInterceptor">
+ <!--
+ set cache transaction method name patterns for methods that
+ directly or indirectly add cache transactions so that they
+ can properly rollback and cleanup thread local storage
+ -->
+ <constructor-arg>
+ <list>
+ <value>update*</value>
+ <value>addPages</value>
+ </list>
+ </constructor-arg>
+ </bean>
</list>
</property>
<!-- Replace support:
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org