You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2015/10/26 13:22:12 UTC

svn commit: r1710585 - in /qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest: ClientRunner.java ControllerRunner.java

Author: kwall
Date: Mon Oct 26 12:22:12 2015
New Revision: 1710585

URL: http://svn.apache.org/viewvc?rev=1710585&view=rev
Log:
NO-JIRA: [Perf Test Framework] Join on client (participant) threads to avoid race in clean (prevents sporadic test failure on Jenkins).

Modified:
    qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java
    qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java

Modified: qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java?rev=1710585&r1=1710584&r2=1710585&view=diff
==============================================================================
--- qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java (original)
+++ qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java Mon Oct 26 12:22:12 2015
@@ -19,6 +19,9 @@
  */
 package org.apache.qpid.disttest;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 import javax.naming.Context;
 import javax.naming.NamingException;
 
@@ -30,10 +33,11 @@ import org.slf4j.LoggerFactory;
 public class ClientRunner extends AbstractRunner
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(ClientRunner.class);
-
     public static final String NUM_OF_CLIENTS_PROP = "number-of-clients";
 
     public static final String NUM_OF_CLIENTS_DEFAULT = "1";
+    private static final int AWAIT_SHUTDOWN_TIMEOUT = 30000;
+    private Collection<Thread> _clientThreads = new ArrayList<>();
 
     public ClientRunner()
     {
@@ -67,32 +71,55 @@ public class ClientRunner extends Abstra
 
         for(int i = 1; i <= numClients; i++)
         {
-            createBackgroundClient(context);
+            Thread clientThread = createBackgroundClient(context);
+            _clientThreads.add(clientThread);
         }
     }
 
-    private void createBackgroundClient(Context context)
+    private Thread createBackgroundClient(Context context)
     {
         try
         {
             final Client client = new Client(new ClientJmsDelegate(context));
 
-            final Thread clientThread = new Thread(new Runnable()
+            Thread clientThread = new Thread(new Runnable()
             {
                 @Override
                 public void run()
                 {
-                    LOGGER.info("Starting client " + client.getClientName());
+                    LOGGER.info("Starting client {}", client.getClientName());
                     client.start();
                     client.waitUntilStopped();
-                    LOGGER.info("Stopped client " + client.getClientName());
+                    LOGGER.info("Stopped client {}", client.getClientName());
                 }
             });
             clientThread.start();
+            return clientThread;
+
         }
         catch (NamingException e)
         {
             throw new DistributedTestException("Exception while creating client instance", e);
         }
     }
+
+    public void awaitShutdown()
+    {
+        for (Thread thread : _clientThreads)
+        {
+            try
+            {
+                thread.join(AWAIT_SHUTDOWN_TIMEOUT);
+                if (thread.isAlive())
+                {
+                    LOGGER.warn("Client thread {} failed to shutdown within timeout {} ms",
+                                thread, AWAIT_SHUTDOWN_TIMEOUT);
+                }
+            }
+            catch (InterruptedException e)
+            {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
 }

Modified: qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java?rev=1710585&r1=1710584&r2=1710585&view=diff
==============================================================================
--- qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java (original)
+++ qpid/java/trunk/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java Mon Oct 26 12:22:12 2015
@@ -22,6 +22,8 @@ package org.apache.qpid.disttest;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import javax.naming.Context;
@@ -34,7 +36,6 @@ import org.apache.qpid.disttest.db.Resul
 import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
 import org.apache.qpid.disttest.results.CompositeResultsWriter;
 import org.apache.qpid.disttest.results.ResultsCsvWriter;
-import org.apache.qpid.disttest.results.ResultsWriter;
 import org.apache.qpid.disttest.results.ResultsXmlWriter;
 import org.apache.qpid.disttest.results.aggregation.Aggregator;
 import org.slf4j.Logger;
@@ -114,13 +115,19 @@ public class ControllerRunner extends Ab
                                                    DistributedTestConstants.REGISTRATION_TIMEOUT,
                                                    DistributedTestConstants.COMMAND_RESPONSE_TIMEOUT,
                                                    getCliOptions());
+
+            String testConfigPath = getCliOptions().get(ControllerRunner.TEST_CONFIG_PROP);
+            List<String> testConfigFiles = _configFileHelper.getTestConfigFiles(testConfigPath);
+            Collection<ClientRunner> clients = createClientsIfNotDistributed(testConfigFiles);
+
             try
             {
-                runTests(controller);
+                runTests(controller, testConfigFiles);
             }
             finally
             {
                 controller.stopAllRegisteredClients();
+                awaitClientShutdown(clients);
             }
         }
         finally
@@ -160,12 +167,9 @@ public class ControllerRunner extends Ab
         _resultsWriter.end();
     }
 
-    private void runTests(Controller controller)
+    private void runTests(Controller controller, List<String> testConfigFiles)
     {
         boolean testError = false;
-        String testConfigPath = getCliOptions().get(ControllerRunner.TEST_CONFIG_PROP);
-        List<String> testConfigFiles = _configFileHelper.getTestConfigFiles(testConfigPath);
-        createClientsIfNotDistributed(testConfigFiles);
 
         try
         {
@@ -212,7 +216,7 @@ public class ControllerRunner extends Ab
         return resultsForAllTests;
     }
 
-    private void createClientsIfNotDistributed(final List<String> testConfigFiles)
+    private Collection<ClientRunner> createClientsIfNotDistributed(final List<String> testConfigFiles)
     {
         if(!isDistributed())
         {
@@ -225,12 +229,25 @@ public class ControllerRunner extends Ab
             }
 
             //we must create the required test clients, running in single-jvm mode
+            Collection<ClientRunner> runners = new ArrayList<>(maxNumberOfClients);
             for (int i = 1; i <= maxNumberOfClients; i++)
             {
                 ClientRunner clientRunner = new ClientRunner();
                 clientRunner.setJndiPropertiesFileLocation(getJndiConfig());
                 clientRunner.runClients();
+                runners.add(clientRunner);
+
             }
+            return runners;
+        }
+        return Collections.emptyList();
+    }
+
+    private void awaitClientShutdown(final Collection<ClientRunner> clients)
+    {
+        for(ClientRunner client: clients)
+        {
+            client.awaitShutdown();
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org