You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sandesha-dev@ws.apache.org by da...@apache.org on 2008/11/24 19:07:15 UTC

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

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);



---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org