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]

Reply via email to