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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]