Author: rgodfrey
Date: Fri Jun 22 10:52:38 2012
New Revision: 1352838

URL: http://svn.apache.org/viewvc?rev=1352838&view=rev
Log:
QPID-4081: [Java Tests] Applied patch supplied by Alex Rudyy

Modified:
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java?rev=1352838&r1=1352837&r2=1352838&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java
 Fri Jun 22 10:52:38 2012
@@ -25,4 +25,5 @@ public interface BrokerHolder
     String getWorkingDirectory();
     void shutdown();
     void kill();
+    String dumpThreads();
 }

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java?rev=1352838&r1=1352837&r2=1352838&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java
 Fri Jun 22 10:52:38 2012
@@ -20,6 +20,9 @@
  */
 package org.apache.qpid.test.utils;
 
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
 import java.util.Set;
 
 import org.apache.log4j.Logger;
@@ -69,12 +72,44 @@ public class InternalBrokerHolder implem
     {
         // Can't kill a internal broker as we would also kill ourselves as we 
share the same JVM.
         shutdown();
-
-        waitUntilPortsAreFree();
     }
 
     private void waitUntilPortsAreFree()
     {
         new PortHelper().waitUntilPortsAreFree(_portsUsedByBroker);
     }
+
+    @Override
+    public String dumpThreads()
+    {
+        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
+        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(true, true);
+        StringBuilder dump = new StringBuilder();
+        dump.append(String.format("%n"));
+        for (ThreadInfo threadInfo : threadInfos)
+        {
+            dump.append(threadInfo);
+        }
+
+        long[] deadLocks = threadMXBean.findDeadlockedThreads();
+        if (deadLocks != null && deadLocks.length > 0)
+        {
+            ThreadInfo[] deadlockedThreads = 
threadMXBean.getThreadInfo(deadLocks);
+            dump.append(String.format("%n"));
+            dump.append("Deadlock is detected!");
+            dump.append(String.format("%n"));
+            for (ThreadInfo threadInfo : deadlockedThreads)
+            {
+                dump.append(threadInfo);
+            }
+        }
+        return dump.toString();
+    }
+
+    @Override
+    public String toString()
+    {
+        return "InternalBrokerHolder [_portsUsedByBroker=" + 
_portsUsedByBroker + "]";
+    }
+
 }

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java?rev=1352838&r1=1352837&r2=1352838&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
 Fri Jun 22 10:52:38 2012
@@ -713,11 +713,55 @@ public class QpidBrokerTestCase extends 
 
     public void stopAllBrokers()
     {
+        boolean exceptionOccured = false;
         Set<Integer> runningBrokerPorts = new 
HashSet<Integer>(getBrokerPortNumbers());
         for (int brokerPortNumber : runningBrokerPorts)
         {
+            if (!stopBrokerSafely(brokerPortNumber))
+            {
+                exceptionOccured = true;
+            }
+        }
+        if (exceptionOccured)
+        {
+            throw new RuntimeException("Exception occured on stopping of test 
broker. Please, examine logs for details");
+        }
+    }
+
+    protected boolean stopBrokerSafely(int brokerPortNumber)
+    {
+        boolean success = true;
+        BrokerHolder broker = _brokers.get(brokerPortNumber);
+        try
+        {
             stopBroker(brokerPortNumber);
         }
+        catch(Exception e)
+        {
+            success = false;
+            _logger.error("Failed to stop broker " + broker + " at port " + 
brokerPortNumber, e);
+            if (broker != null)
+            {
+                // save the thread dump in case of dead locks
+                try
+                {
+                    _logger.error("Broker " + broker + " thread dump:" + 
broker.dumpThreads());
+                }
+                finally
+                {
+                    // try to kill broker
+                    try
+                    {
+                        broker.kill();
+                    }
+                    catch(Exception killException)
+                    {
+                        // ignore
+                    }
+                }
+            }
+        }
+        return success;
     }
 
     public void stopBroker(int port)

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java?rev=1352838&r1=1352837&r2=1352838&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
 Fri Jun 22 10:52:38 2012
@@ -20,7 +20,9 @@
  */
 package org.apache.qpid.test.utils;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Set;
 
 import org.apache.log4j.Logger;
@@ -158,4 +160,32 @@ public class SpawnedBrokerHolder impleme
         new PortHelper().waitUntilPortsAreFree(_portsUsedByBroker);
     }
 
+    @Override
+    public String dumpThreads()
+    {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try
+        {
+            Process process = Runtime.getRuntime().exec("jstack " + _pid);
+            InputStream is = process.getInputStream();
+            byte[] buffer = new byte[1024];
+            int length = -1;
+            while ((length = is.read(buffer)) != -1)
+            {
+                baos.write(buffer, 0, length);
+            }
+         }
+        catch (Exception e)
+        {
+            LOGGER.error("Error whilst collecting thread dump for " + _pid, e);
+        }
+        return new String(baos.toByteArray());
+    }
+
+    @Override
+    public String toString()
+    {
+        return "SpawnedBrokerHolder [_pid=" + _pid + ", _portsUsedByBroker="
+                + _portsUsedByBroker + "]";
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to