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