Author: mlovett
Date: Mon Dec  4 01:36:28 2006
New Revision: 482110

URL: http://svn.apache.org/viewvc?view=rev&rev=482110
Log:
Implement deadlock detection for the in-memory store, see SANDESHA2-49

Modified:
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/NextMsgBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/SequencePropertyBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryCreateSeqBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryInvokerBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryNextMsgBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySenderBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySequencePropertyBeanMgr.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java
    
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
 Mon Dec  4 01:36:28 2006
@@ -756,15 +756,44 @@
        public static void forceDispatchOfInboundMessages(ConfigurationContext 
configContext, 
                        String sequenceID,
                        boolean allowLaterDeliveryOfMissingMessages)throws 
SandeshaException{
-               //only do this if we are running inOrder
-               
if(SandeshaUtil.getPropertyBean(configContext.getAxisConfiguration()).isInOrder()){
-                       Invoker invoker = (Invoker) 
configContext.getProperty(Sandesha2Constants.INVOKER);
-                       if (invoker==null){
-                               throw new 
SandeshaException(SandeshaMessageHelper.getMessage(
-                                       SandeshaMessageKeys.invokerNotFound, 
sequenceID));
+               String withinTransactionStr = (String) 
configContext.getProperty(Sandesha2Constants.WITHIN_TRANSACTION);
+               boolean withinTransaction = false;
+               if (withinTransactionStr != null && 
Sandesha2Constants.VALUE_TRUE.equals(withinTransactionStr))
+                       withinTransaction = true;
+
+               Transaction reportTransaction = null;
+               if (!withinTransaction) {
+                       StorageManager storageManager = 
SandeshaUtil.getSandeshaStorageManager(configContext, 
configContext.getAxisConfiguration());
+                       reportTransaction = storageManager.getTransaction();
+                       
configContext.setProperty(Sandesha2Constants.WITHIN_TRANSACTION, 
Sandesha2Constants.VALUE_TRUE);
+               }
+
+               boolean rolledback = false;
+
+               try {
+
+                       //only do this if we are running inOrder
+                       
if(SandeshaUtil.getPropertyBean(configContext.getAxisConfiguration()).isInOrder()){
+                               Invoker invoker = (Invoker) 
configContext.getProperty(Sandesha2Constants.INVOKER);
+                               if (invoker==null){
+                                       throw new 
SandeshaException(SandeshaMessageHelper.getMessage(
+                                               
SandeshaMessageKeys.invokerNotFound, sequenceID));
+                               }
+                               
+                               
invoker.forceInvokeOfAllMessagesCurrentlyOnSequence(configContext, sequenceID, 
allowLaterDeliveryOfMissingMessages);                    
                        }
                        
-                       
invoker.forceInvokeOfAllMessagesCurrentlyOnSequence(configContext, sequenceID, 
allowLaterDeliveryOfMissingMessages);                    
+               } catch (Exception e) {
+                       if (!withinTransaction && reportTransaction!=null) {
+                               reportTransaction.rollback();
+                               
configContext.setProperty(Sandesha2Constants.WITHIN_TRANSACTION, 
Sandesha2Constants.VALUE_FALSE);
+                               rolledback = true;
+                       }
+               } finally {
+                       if (!withinTransaction && !rolledback && 
reportTransaction!=null) {
+                               reportTransaction.commit();
+                               
configContext.setProperty(Sandesha2Constants.WITHIN_TRANSACTION, 
Sandesha2Constants.VALUE_FALSE);
+                       }
                }
        }
        

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
 Mon Dec  4 01:36:28 2006
@@ -15,6 +15,8 @@
 
        public static final String commitError="commitError";
        public static final String rollbackError="rollbackError";
+       public static final String deadlock="deadlock";
+       public static final String noTransaction="noTransaction";
        public static final String inMsgError="inMsgError";
        public static final String outMsgError="outMsgError";
        public static final String invokeMsgError="invokeMsgError";

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
 Mon Dec  4 01:36:28 2006
@@ -32,6 +32,8 @@
 
 commitError=Exception thrown when trying to commit the transaction: {0}
 rollbackError=Exception thrown when trying to rollback the transaction: {0}
+deadlock=Sandesha2 Internal Error: deadlock detected. Transaction details 
''{0}'', Bean details ''{1}''.
+noTransaction=Sandesha2 Internal Error: current thread does not have a 
transaction.
 inMsgError=Sandesha2 got an exception when processing an in message: {0}
 outMsgError=Sandesha2 got an exception when processing an out message: {0}
 invokeMsgError=Sandesha2 got an exception when invoking message: {0}

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/NextMsgBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/NextMsgBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/NextMsgBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/NextMsgBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -42,5 +42,5 @@
        
        public NextMsgBean findUnique (NextMsgBean bean) throws 
SandeshaException;
 
-       public Collection retrieveAll();
+       public Collection retrieveAll() throws SandeshaStorageException;
 }

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/SequencePropertyBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/SequencePropertyBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/SequencePropertyBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beanmanagers/SequencePropertyBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -51,5 +51,5 @@
         */
        public boolean updateOrInsert(SequencePropertyBean bean) throws 
SandeshaStorageException;
 
-       public Collection retrieveAll ();
+       public Collection retrieveAll () throws SandeshaStorageException;
 }

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -11,6 +11,7 @@
 import org.apache.sandesha2.SandeshaException;
 import org.apache.sandesha2.i18n.SandeshaMessageHelper;
 import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.beans.RMBean;
 
 abstract class InMemoryBeanMgr {
@@ -30,7 +31,7 @@
                }
        }
        
-       protected boolean insert(Object key, RMBean bean) {
+       protected boolean insert(Object key, RMBean bean) throws 
SandeshaStorageException {
                mgr.enlistBean(bean);
                synchronized (table) {
                        table.put(key, bean);
@@ -38,7 +39,7 @@
                return true;
        }
 
-       protected boolean delete(Object key) {
+       protected boolean delete(Object key) throws SandeshaStorageException {
                RMBean bean = null;
                synchronized (table) {
                        bean = (RMBean) table.get(key);
@@ -52,7 +53,7 @@
                return bean != null;
        }
 
-       protected RMBean retrieve(Object key) {
+       protected RMBean retrieve(Object key) throws SandeshaStorageException {
                RMBean bean = null;
                synchronized (table) {
                        bean = (RMBean) table.get(key);
@@ -66,7 +67,7 @@
                return bean;
        }
 
-       protected boolean update(Object key, RMBean bean) {
+       protected boolean update(Object key, RMBean bean) throws 
SandeshaStorageException {
                mgr.enlistBean(bean);
                RMBean oldBean = null;
                synchronized (table) {
@@ -79,7 +80,7 @@
                return true;
        }
 
-       protected List find(RMBean matchInfo) {
+       protected List find(RMBean matchInfo) throws SandeshaStorageException {
                ArrayList beans = new ArrayList();
                synchronized (table) {
                        if(matchInfo == null) {

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryCreateSeqBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryCreateSeqBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryCreateSeqBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryCreateSeqBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -17,7 +17,6 @@
 
 package org.apache.sandesha2.storage.inmemory;
 
-import java.sql.ResultSet;
 import java.util.List;
 
 import org.apache.axis2.context.AbstractContext;
@@ -25,8 +24,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.i18n.SandeshaMessageHelper;
-import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
 import org.apache.sandesha2.storage.beans.CreateSeqBean;
 import org.apache.sandesha2.storage.beans.RMBean;
@@ -39,23 +37,23 @@
                super(mgr, context, Sandesha2Constants.BeanMAPs.CREATE_SEQUECE);
        }
 
-       public boolean insert(CreateSeqBean bean) {
+       public boolean insert(CreateSeqBean bean) throws 
SandeshaStorageException {
                return super.insert(bean.getCreateSeqMsgID(), bean);
        }
 
-       public boolean delete(String msgId) {
+       public boolean delete(String msgId) throws SandeshaStorageException {
                return super.delete(msgId);
        }
 
-       public CreateSeqBean retrieve(String msgId) {
+       public CreateSeqBean retrieve(String msgId) throws 
SandeshaStorageException {
                return (CreateSeqBean) super.retrieve(msgId);
        }
 
-       public boolean update(CreateSeqBean bean) {
+       public boolean update(CreateSeqBean bean) throws 
SandeshaStorageException {
                return super.update(bean.getCreateSeqMsgID(), bean);
        }
 
-       public List find(CreateSeqBean bean) {
+       public List find(CreateSeqBean bean) throws SandeshaStorageException {
                return super.find(bean);
        }
        

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryInvokerBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryInvokerBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryInvokerBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryInvokerBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -17,11 +17,6 @@
 
 package org.apache.sandesha2.storage.inmemory;
 
-import java.sql.ResultSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.axis2.context.AbstractContext;
@@ -29,8 +24,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.i18n.SandeshaMessageHelper;
-import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.beanmanagers.InvokerBeanMgr;
 import org.apache.sandesha2.storage.beans.InvokerBean;
 import org.apache.sandesha2.storage.beans.RMBean;
@@ -43,19 +37,19 @@
                super(mgr, context, Sandesha2Constants.BeanMAPs.STORAGE_MAP);
        }
 
-       public boolean insert(InvokerBean bean) {
+       public boolean insert(InvokerBean bean) throws SandeshaStorageException 
{
                return super.insert(bean.getMessageContextRefKey(), bean);
        }
 
-       public boolean delete(String key) {
+       public boolean delete(String key) throws SandeshaStorageException {
                return super.delete(key);
        }
 
-       public InvokerBean retrieve(String key) {
+       public InvokerBean retrieve(String key) throws SandeshaStorageException 
{
                return (InvokerBean) super.retrieve(key);
        }
 
-       public List find(InvokerBean bean) {
+       public List find(InvokerBean bean) throws SandeshaStorageException {
                return super.find(bean);
        }
        
@@ -81,7 +75,7 @@
                return select;
        }
 
-       public boolean update(InvokerBean bean) {
+       public boolean update(InvokerBean bean) throws SandeshaStorageException 
{
                return super.update(bean.getMessageContextRefKey(), bean);
        }
        

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryNextMsgBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryNextMsgBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryNextMsgBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryNextMsgBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -17,11 +17,7 @@
 
 package org.apache.sandesha2.storage.inmemory;
 
-import java.sql.ResultSet;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.axis2.context.AbstractContext;
@@ -29,8 +25,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.i18n.SandeshaMessageHelper;
-import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.beanmanagers.NextMsgBeanMgr;
 import org.apache.sandesha2.storage.beans.NextMsgBean;
 import org.apache.sandesha2.storage.beans.RMBean;
@@ -43,19 +38,19 @@
                super(mgr, context, Sandesha2Constants.BeanMAPs.NEXT_MESSAGE);
        }
 
-       public boolean delete(String sequenceId) {
+       public boolean delete(String sequenceId) throws 
SandeshaStorageException {
                return super.delete(sequenceId);
        }
 
-       public NextMsgBean retrieve(String sequenceId) {
+       public NextMsgBean retrieve(String sequenceId) throws 
SandeshaStorageException {
                return (NextMsgBean) super.retrieve(sequenceId);
        }
 
-       public boolean insert(NextMsgBean bean) {
+       public boolean insert(NextMsgBean bean) throws SandeshaStorageException 
{
                return super.insert(bean.getSequenceID(), bean);
        }
 
-       public List find(NextMsgBean bean) {
+       public List find(NextMsgBean bean) throws SandeshaStorageException {
                return super.find(bean);
        }
        
@@ -77,11 +72,11 @@
                return equal;
        }
 
-       public boolean update(NextMsgBean bean) {
+       public boolean update(NextMsgBean bean) throws SandeshaStorageException 
{
                return super.update(bean.getSequenceID(), bean);
        }
 
-       public Collection retrieveAll() {
+       public Collection retrieveAll() throws SandeshaStorageException {
                return super.find(null);
        }
        

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySenderBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySenderBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySenderBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySenderBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -40,11 +40,11 @@
                super(mgr, context, Sandesha2Constants.BeanMAPs.RETRANSMITTER);
        }
 
-       public boolean delete(String MessageId) {
+       public boolean delete(String MessageId) throws SandeshaStorageException 
{
                return super.delete(MessageId);
        }
 
-       public SenderBean retrieve(String MessageId) {
+       public SenderBean retrieve(String MessageId) throws 
SandeshaStorageException {
                return (SenderBean) super.retrieve(MessageId);
        }
 
@@ -55,7 +55,7 @@
                return super.insert(bean.getMessageID(), bean);
        }
 
-       public List find(String internalSequenceID) {
+       public List find(String internalSequenceID) throws 
SandeshaStorageException {
                SenderBean temp = new SenderBean();
                temp.setInternalSequenceID(internalSequenceID);
                return super.find(temp);
@@ -122,11 +122,11 @@
                return add;
        }
 
-       public List find(SenderBean bean) {
+       public List find(SenderBean bean) throws SandeshaStorageException {
                return super.find(bean);
        }
 
-       public SenderBean getNextMsgToSend() {
+       public SenderBean getNextMsgToSend() throws SandeshaStorageException {
                // Set up match criteria
                SenderBean matcher = new SenderBean();
                matcher.setSend(true);
@@ -156,7 +156,7 @@
                return result;
        }
        
-       public boolean update(SenderBean bean) {
+       public boolean update(SenderBean bean) throws SandeshaStorageException {
                return super.update(bean.getMessageID(), bean);
        }
        

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySequencePropertyBeanMgr.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySequencePropertyBeanMgr.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySequencePropertyBeanMgr.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemorySequencePropertyBeanMgr.java
 Mon Dec  4 01:36:28 2006
@@ -25,6 +25,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
 import org.apache.sandesha2.storage.beans.RMBean;
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;
@@ -37,19 +38,19 @@
                super(mgr, context, 
Sandesha2Constants.BeanMAPs.SEQUENCE_PROPERTY);
        }
 
-       public boolean delete(String sequenceId, String name) {
+       public boolean delete(String sequenceId, String name) throws 
SandeshaStorageException {
                return super.delete(getId(sequenceId, name));
        }
 
-       public SequencePropertyBean retrieve(String sequenceId, String name) {
+       public SequencePropertyBean retrieve(String sequenceId, String name) 
throws SandeshaStorageException {
                return (SequencePropertyBean) super.retrieve(getId(sequenceId, 
name));
        }
 
-       public boolean insert(SequencePropertyBean bean) {
+       public boolean insert(SequencePropertyBean bean) throws 
SandeshaStorageException {
                return super.insert(getId(bean), bean);
        }
 
-       public List find(SequencePropertyBean bean) {
+       public List find(SequencePropertyBean bean) throws 
SandeshaStorageException {
                return super.find(bean);
        }
        
@@ -74,7 +75,7 @@
                return equal;
        }
 
-       public boolean update(SequencePropertyBean bean) {      
+       public boolean update(SequencePropertyBean bean) throws 
SandeshaStorageException {      
                return super.update(getId(bean), bean);
        }
        
@@ -93,7 +94,7 @@
                return (SequencePropertyBean) super.findUnique(bean);
        }
 
-       public Collection retrieveAll() {
+       public Collection retrieveAll() throws SandeshaStorageException {
                return super.find(null);
        }
        

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
 Mon Dec  4 01:36:28 2006
@@ -63,14 +63,22 @@
        }
 
        public Transaction getTransaction() {
+               // Calling getTransaction is the only way to set up a new 
transaction. If you
+               // do some work that requires a tran without there being a 
transaction in scope
+               // then the enlist method will throw an exception.
                Transaction result = null;
                synchronized (transactions) {
                        Thread key = Thread.currentThread();
                        String name = key.getName();
+                       int    id = System.identityHashCode(key);
                        result = (Transaction) transactions.get(key);
                        if(result == null) {
-                               result = new InMemoryTransaction(this, name);
+                               result = new InMemoryTransaction(this, name, 
id);
                                transactions.put(key, result);
+                       } else {
+                               // We just returned an existing transaction. 
That might be ok, but it
+                               // might be an indication of a real problem.
+                               if(log.isDebugEnabled()) log.debug("Possible 
re-used transaction: " + result);
                        }
                }
                return result;
@@ -83,8 +91,19 @@
                }
        }
        
-       void enlistBean(RMBean bean) {
-               InMemoryTransaction t = (InMemoryTransaction) getTransaction();
+       void enlistBean(RMBean bean) throws SandeshaStorageException {
+               InMemoryTransaction t = null;
+               synchronized (transactions) {
+                       Thread key = Thread.currentThread();
+                       t = (InMemoryTransaction) transactions.get(key);
+                       if(t == null) {
+                               // We attempted to do some work without a 
transaction in scope
+                               String message = 
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.noTransaction);
+                               SandeshaStorageException e = new 
SandeshaStorageException(message);
+                               if(log.isDebugEnabled()) log.debug(message, e);
+                               throw e;
+                       }
+               }
                t.enlist(bean);
        }
        
@@ -185,3 +204,4 @@
        
        
 }
+

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java
 Mon Dec  4 01:36:28 2006
@@ -18,10 +18,14 @@
 package org.apache.sandesha2.storage.inmemory;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.sandesha2.i18n.SandeshaMessageHelper;
+import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beans.RMBean;
 
@@ -36,12 +40,15 @@
 
        private InMemoryStorageManager manager;
        private String threadName;
+       private int    threadId;
        private ArrayList enlistedBeans = new ArrayList();
+       private InMemoryTransaction waitingForTran = null;
        
-       InMemoryTransaction(InMemoryStorageManager manager, String threadName) {
+       InMemoryTransaction(InMemoryStorageManager manager, String threadName, 
int id) {
                if(log.isDebugEnabled()) log.debug("Entry: 
InMemoryTransaction::<init>");
                this.manager = manager;
                this.threadName = threadName;
+               this.threadId = id;
                if(log.isDebugEnabled()) log.debug("Exit: 
InMemoryTransaction::<init>, " + this);
        }
        
@@ -57,18 +64,32 @@
                return !enlistedBeans.isEmpty();
        }
 
-       public void enlist(RMBean bean) {
+       public void enlist(RMBean bean) throws SandeshaStorageException {
                if(log.isDebugEnabled()) log.debug("Entry: 
InMemoryTransaction::enlist, " + bean);
                if(bean != null) {
                        synchronized (bean) {
-                               Transaction other = bean.getTransaction();
+                               InMemoryTransaction other = 
(InMemoryTransaction) bean.getTransaction();
                                while(other != null && other != this) {
+                                       // Put ourselves into the list of 
waiters
+                                       waitingForTran = other;
 
+                                       // Look to see if there is a loop in 
the chain of waiters
                                        if(!enlistedBeans.isEmpty()) {
-                                               Exception e = new 
Exception("Possible deadlock");
-                                               if(log.isDebugEnabled()) {
-                                                       log.debug("Possible 
deadlock", e);
-                                                       log.debug(this + ", " + 
bean);
+                                               HashSet set = new HashSet();
+                                               set.add(this);
+                                               while(other != null) {
+                                                       if(set.contains(other)) 
{
+                                                               // Do our best 
to get out of the way of the other work in the system
+                                                               waitingForTran 
= null;
+                                                               releaseLocks();
+
+                                                               String message 
= SandeshaMessageHelper.getMessage(SandeshaMessageKeys.deadlock, 
this.toString(), bean.toString());
+                                                               
SandeshaStorageException e = new SandeshaStorageException(message);
+                                                               
if(log.isDebugEnabled()) log.debug(message, e);
+                                                               throw e;
+                                                       }
+                                                       set.add(other);
+                                                       other = 
other.waitingForTran;
                                                }
                                        }
 
@@ -78,8 +99,10 @@
                                        } catch(InterruptedException e) {
                                                // Do nothing
                                        }
-                                       other = bean.getTransaction();
+                                       other = (InMemoryTransaction) 
bean.getTransaction();
                                }
+                               
+                               waitingForTran = null;
                                if(other == null) {
                                        if(log.isDebugEnabled()) log.debug(this 
+ " locking bean");
                                        bean.setTransaction(this);
@@ -109,7 +132,9 @@
        
        public String toString() {
                StringBuffer result = new StringBuffer();
-               result.append("[InMemoryTransaction, name: ");
+               result.append("[InMemoryTransaction, id:");
+               result.append(threadId);
+               result.append(", name: ");
                result.append(threadName);
                result.append(", locks: ");
                result.append(enlistedBeans.size());
@@ -117,3 +142,4 @@
                return result.toString();
        }
 }
+

Modified: 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java?view=diff&rev=482110&r1=482109&r2=482110
==============================================================================
--- 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java
 (original)
+++ 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java
 Mon Dec  4 01:36:28 2006
@@ -14,6 +14,7 @@
 import org.apache.sandesha2.client.SandeshaClient;
 import org.apache.sandesha2.client.SandeshaClientConstants;
 import org.apache.sandesha2.storage.StorageManager;
+import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beans.NextMsgBean;
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;
 import org.apache.sandesha2.util.RangeString;
@@ -61,9 +62,11 @@
                        serviceClient.fireAndForget(getPingOMBlock("ping3"));
        
                        Thread.sleep(5000);
-                       
+                       StorageManager mgr = 
SandeshaUtil.getInMemoryStorageManager(configContext);
+                       Transaction t = mgr.getTransaction();
                        String inboundSequenceID = 
SandeshaUtil.getSequenceIDFromInternalSequenceID(SandeshaUtil.getInternalSequenceID(to,
 sequenceKey),
-                                       
SandeshaUtil.getInMemoryStorageManager(configContext));
+                                       mgr);
+                       t.commit();
                        
                        
SandeshaClient.forceDispatchOfInboundMessages(serverConfigCtx, 
                                        inboundSequenceID, 
@@ -71,6 +74,7 @@
                        
                        //check that the server is now expecting msg 4
                        StorageManager serverStore = 
SandeshaUtil.getInMemoryStorageManager(serverConfigCtx);
+                       t = serverStore.getTransaction();
                        NextMsgBean nextMsgBean = 
                                
serverStore.getNextMsgBeanMgr().retrieve(inboundSequenceID);
                        assertNotNull(nextMsgBean);
@@ -85,14 +89,17 @@
                        assertNotNull(outOfOrderRanges);
                        RangeString rangeString = new 
RangeString(outOfOrderRanges.getValue());
                        assertTrue(rangeString.isMessageNumberInRanges(2));
+                       t.commit();
                        
                        //we deliver msg 2
                        //set highest out msg number to 1
+                       t = mgr.getTransaction();
                        SequencePropertyBean nextMsgNoBean = 
-                                       
SandeshaUtil.getInMemoryStorageManager(configContext).getSequencePropertyBeanMgr().
+                                       mgr.getSequencePropertyBeanMgr().
                                        
retrieve(SandeshaUtil.getInternalSequenceID(to, sequenceKey),
                                        
Sandesha2Constants.SequenceProperties.NEXT_MESSAGE_NUMBER);
                        nextMsgNoBean.setValue("1");
+                       t.commit();
                        
                        
clientOptions.setProperty(SandeshaClientConstants.MESSAGE_NUMBER,new Long(2));
                        serviceClient.fireAndForget(getPingOMBlock("ping2"));
@@ -132,17 +139,21 @@
        
                        Thread.sleep(5000);
                        
+                       StorageManager mgr = 
SandeshaUtil.getInMemoryStorageManager(configContext);
+                       Transaction t = mgr.getTransaction();
                        String inboundSequenceID = 
SandeshaUtil.getSequenceIDFromInternalSequenceID(SandeshaUtil.getInternalSequenceID(to,
 sequenceKey),
-                                       
SandeshaUtil.getInMemoryStorageManager(configContext));
+                                       mgr);
+                       t.commit();
                        
                        
SandeshaClient.forceDispatchOfInboundMessages(serverConfigCtx, 
inboundSequenceID, false);
                        
                        //check that the server is now expecting msg 4
-                       NextMsgBean nextMsgBean = 
-                               
SandeshaUtil.getInMemoryStorageManager(serverConfigCtx).getNextMsgBeanMgr().
-                                       retrieve(inboundSequenceID);
+                       StorageManager serverMgr = 
SandeshaUtil.getInMemoryStorageManager(serverConfigCtx);
+                       t = serverMgr.getTransaction();
+                       NextMsgBean nextMsgBean = 
serverMgr.getNextMsgBeanMgr().retrieve(inboundSequenceID);
                        assertNotNull(nextMsgBean);
                        assertEquals(nextMsgBean.getNextMsgNoToProcess(), 4);
+                       t.commit();
          }
                finally{
                        configContext.getListenerManager().stop();



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

Reply via email to