BUG 5413 - RestPerfClient: Hang on java.util.concurrent.CancellationException. 80/35980/3
authorJakub Morvay <jmorvay@cisco.com>
Wed, 9 Mar 2016 10:35:51 +0000 (11:35 +0100)
committerJakub Morvay <jmorvay@cisco.com>
Mon, 14 Mar 2016 14:39:25 +0000 (15:39 +0100)
Make timeout for executing requests customizable via parameter --timeout.
Check for cancelled tasks.

Change-Id: I73256bb52d8056f3345621b9a57a0dd3b9cbdfb5
Signed-off-by: Jakub Morvay <jmorvay@cisco.com>
opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/Parameters.java
opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/RestPerfClient.java

index 7985eef925204e3656fc75698cbaaf3081141dea..6f5736f0112b7cd67e3b24f0f18eeb848c1fab66 100644 (file)
@@ -53,6 +53,9 @@ public class Parameters {
     @Arg(dest = "auth")
     public ArrayList<String> auth;
 
+    @Arg(dest = "timeout")
+    public long timeout;
+
     static ArgumentParser getParser() {
         final ArgumentParser parser = ArgumentParsers.newArgumentParser("netconf stress client");
 
@@ -122,12 +125,19 @@ public class Parameters {
                 .help("Username and password for HTTP basic authentication in order username password.")
                 .dest("auth");
 
+        parser.addArgument("--timeout")
+                .type(Long.class)
+                .setDefault(5)
+                .help("Maximum time in minutes to wait for finishing all requests.")
+                .dest("timeout");
+
         return parser;
     }
 
     void validate() {
         Preconditions.checkArgument(port > 0, "Port =< 0");
         Preconditions.checkArgument(editCount > 0, "Edit count =< 0");
+        Preconditions.checkArgument(timeout > 0, "Timeout =< 0");
 
         Preconditions.checkArgument(editContent.exists(), "Edit content file missing");
         Preconditions.checkArgument(editContent.isDirectory() == false, "Edit content file is a dir");
index 270f6b0db94ecf7b54b5bde1c870da006eb7069b..5f6f490afc02069bfef37e9f61ae75433f0efc15 100644 (file)
@@ -20,7 +20,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 import net.sourceforge.argparse4j.inf.ArgumentParser;
 import net.sourceforge.argparse4j.inf.ArgumentParserException;
 import org.opendaylight.netconf.test.tool.TestToolUtils;
@@ -133,18 +132,23 @@ public class RestPerfClient {
         LOG.info("Starting performance test");
         final Stopwatch started = Stopwatch.createStarted();
         try {
-            final List<Future<Void>> futures = executorService.invokeAll(callables, 5, TimeUnit.MINUTES);
-            for (final Future<Void> future : futures) {
-                try {
-                    future.get(4L, TimeUnit.MINUTES);
-                } catch (ExecutionException | TimeoutException e) {
-                    throw new RuntimeException(e);
+            final List<Future<Void>> futures = executorService.invokeAll(callables, parameters.timeout, TimeUnit.MINUTES);
+            for (int i = 0; i < futures.size(); i++) {
+                Future<Void> future = futures.get(i);
+                if (future.isCancelled()) {
+                    LOG.info("{}. thread timed out.", i + 1);
+                } else {
+                    try {
+                        future.get();
+                    } catch (final ExecutionException e) {
+                        LOG.info("{}. thread failed.", i + 1, e);
+                    }
                 }
             }
-            executorService.shutdownNow();
         } catch (final InterruptedException e) {
-            throw new RuntimeException("Unable to execute requests", e);
+            LOG.warn("Unable to execute requests", e);
         }
+        executorService.shutdownNow();
         started.stop();
 
         LOG.info("FINISHED. Execution time: {}", started);