Author: gatfora
Date: Thu Jul 19 09:12:20 2007
New Revision: 557671

URL: http://svn.apache.org/viewvc?view=rev&rev=557671
Log:
Fix deadlock when piggybacking Acks where the SenderBean and RmdBean locks are 
taken in the wrong order

Modified:
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/AcknowledgementManager.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/AcknowledgementManager.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/AcknowledgementManager.java?view=diff&rev=557671&r1=557670&r2=557671
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/AcknowledgementManager.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/AcknowledgementManager.java
 Thu Jul 19 09:12:20 2007
@@ -39,6 +39,7 @@
 import org.apache.sandesha2.i18n.SandeshaMessageHelper;
 import org.apache.sandesha2.i18n.SandeshaMessageKeys;
 import org.apache.sandesha2.storage.StorageManager;
+import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.SenderBeanMgr;
 import org.apache.sandesha2.storage.beans.RMDBean;
 import org.apache.sandesha2.storage.beans.SenderBean;
@@ -58,7 +59,7 @@
         * @param applicationRMMsgContext
         * @throws SandeshaException
         */
-       public static void piggybackAcksIfPresent(RMMsgContext 
rmMessageContext, StorageManager storageManager)
+       public static Transaction piggybackAcksIfPresent(RMMsgContext 
rmMessageContext, StorageManager storageManager, Transaction transaction)
                        throws SandeshaException {
                if (log.isDebugEnabled())
                        log.debug("Enter: 
AcknowledgementManager::piggybackAcksIfPresent");
@@ -103,7 +104,7 @@
                                }
                        }
                        if(log.isDebugEnabled()) log.debug("Exit: 
AcknowledgementManager::piggybackAcksIfPresent, anon");
-                       return;
+                       return transaction;
                }
                
                // From here on, we must be dealing with a real address. 
Piggyback all sequences that have an
@@ -115,6 +116,12 @@
                findBean.setToAddress(target.getAddress());
 
                Collection collection = retransmitterBeanMgr.find(findBean);
+               
+               if (transaction != null && transaction.isActive())
+                       transaction.commit();
+               
+               transaction = storageManager.getTransaction();
+               
                Iterator it = collection.iterator();
                while (it.hasNext()) {
                        SenderBean ackBean = (SenderBean) it.next();
@@ -162,6 +169,7 @@
                
                if (log.isDebugEnabled())
                        log.debug("Exit: 
AcknowledgementManager::piggybackAcksIfPresent");
+               return transaction;
        }
 
        /**

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java?view=diff&rev=557671&r1=557670&r2=557671
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java
 Thu Jul 19 09:12:20 2007
@@ -183,8 +183,12 @@
                        int messageType = senderBean.getMessageType();
                        
                        if (isAckPiggybackableMsgType(messageType)) {
+                               // Commit the update
+                               if(transaction != null && 
transaction.isActive()) transaction.commit();
+                               transaction = storageManager.getTransaction();
+
                                // Piggyback ack messages based on the 'To' 
address of the message
-                               
AcknowledgementManager.piggybackAcksIfPresent(rmMsgCtx, storageManager);
+                               transaction = 
AcknowledgementManager.piggybackAcksIfPresent(rmMsgCtx, storageManager, 
transaction);
                        }
 
                        // sending the message



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to