svn commit: r720244 - /webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java

[email protected]
Newsgroups gmane.comp.apache.webservices.fx.devel
Message-ID <[email protected]>
Author: davidillsley
Date: Mon Nov 24 10:07:14 2008
New Revision: 720244

URL: http://svn.apache.org/viewvc?rev=720244&view=rev
Log:
Detection of possible deadlocks and better trace of InterruptedExceptions

Modified:
    webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java

Modified: webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java?rev=720244&r1=720243&r2=720244&view=diff
==============================================================================
--- webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java (original)
+++ webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/storage/inmemory/InMemoryTransaction.java Mon Nov 24 10:07:14 2008
@@ -19,11 +19,15 @@
 
 package org.apache.sandesha2.storage.inmemory;
 
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantLock;
 
+import org.apache.axis2.java.security.AccessController;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.sandesha2.i18n.SandeshaMessageHelper;
@@ -42,6 +46,25 @@
 
 	private static final Log log = LogFactory.getLog(InMemoryTransaction.class);
 
+	private static int deadlockTimeoutSeconds = 25;
+	
+	// Allow the deadlock timeout to be configured to help debug
+	static{
+		String deadlockProperty = (String) AccessController.doPrivileged(new PrivilegedAction<String>(){
+			public String run() {
+				return System.getProperty("deadlockTimeout");
+			}});
+		if(deadlockProperty != null){
+			try{
+				deadlockTimeoutSeconds = Integer.parseInt(deadlockProperty);
+			}catch(Exception e){
+				if(log.isDebugEnabled()){
+					log.debug("Exception encountered processing the deadlockTimeout property: "+deadlockProperty,e);
+				}
+			}
+		}
+	}
+	
 	private InMemoryStorageManager manager;
 	private String threadName;
 	private ArrayList<RMBean> enlistedBeans = new ArrayList<RMBean>();
@@ -106,6 +129,7 @@
 			}
 
 			boolean locked = false;
+			int count = 0;
 			while (!locked) {
 				locked = tran.tryLock();
 				if (!locked) {
@@ -113,11 +137,19 @@
 					try {
 						locked = tran.tryLock(5, TimeUnit.SECONDS);
 						if (!locked) {
+							count++;
 							if (log.isDebugEnabled())
 								log.debug("Waiting for bean lock 5 seconds");
+							if(count>=deadlockTimeoutSeconds){ // If we've been failed for xx seconds, lets log and give up.
+								deadlockTrace();
+								String message = "Possible deadlock enlisting bean.";
+								IllegalStateException e = new IllegalStateException(message);
+								if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Possible deadlock enlisting bean.", e);
+								throw e;
+							}
 						}
 					} catch (InterruptedException e) {
-						e.printStackTrace();
+						log.warn("InterruptedException encountered enlisting bean", e);
 					}
 				}
 
@@ -134,6 +166,17 @@
 		if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: InMemoryTransaction::enlist");
 	}
 	
+	private static synchronized void deadlockTrace(){
+		Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
+		log.warn("Possible deadlock enlisting bean. Threads: ");
+		for(Entry<Thread, StackTraceElement[]> entry: map.entrySet()){
+			log.warn(entry.getKey().toString());
+			for(StackTraceElement ste: entry.getValue()){
+				log.warn("\tat "+ste.toString());
+			}
+		}
+	}
+	
 	private void releaseLocks() {
 		if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Entry: InMemoryTransaction::releaseLocks, " + this);
 		manager.removeTransaction(this);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.