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