You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by ml...@apache.org on 2006/12/04 10:36:29 UTC

svn commit: r482110 - in /webservices/sandesha/trunk/java: src/org/apache/sandesha2/client/ src/org/apache/sandesha2/i18n/ src/org/apache/sandesha2/storage/beanmanagers/ src/org/apache/sandesha2/storage/inmemory/ test/src/org/apache/sandesha2/workers/

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: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org