From 1e8b89a012bbaf8b37d3270b68ca860e6389a8cd Mon Sep 17 00:00:00 2001 From: Jakub Morvay Date: Wed, 9 Mar 2016 11:35:51 +0100 Subject: [PATCH] BUG 5413 - RestPerfClient: Hang on java.util.concurrent.CancellationException. Make timeout for executing requests customizable via parameter --timeout. Check for cancelled tasks. Change-Id: I73256bb52d8056f3345621b9a57a0dd3b9cbdfb5 Signed-off-by: Jakub Morvay --- .../tool/client/http/perf/Parameters.java | 10 +++++++++ .../tool/client/http/perf/RestPerfClient.java | 22 +++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/Parameters.java b/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/Parameters.java index 7985eef925..6f5736f011 100644 --- a/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/Parameters.java +++ b/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/Parameters.java @@ -53,6 +53,9 @@ public class Parameters { @Arg(dest = "auth") public ArrayList 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"); diff --git a/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/RestPerfClient.java b/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/RestPerfClient.java index 270f6b0db9..5f6f490afc 100644 --- a/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/RestPerfClient.java +++ b/opendaylight/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/client/http/perf/RestPerfClient.java @@ -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> futures = executorService.invokeAll(callables, 5, TimeUnit.MINUTES); - for (final Future future : futures) { - try { - future.get(4L, TimeUnit.MINUTES); - } catch (ExecutionException | TimeoutException e) { - throw new RuntimeException(e); + final List> futures = executorService.invokeAll(callables, parameters.timeout, TimeUnit.MINUTES); + for (int i = 0; i < futures.size(); i++) { + Future 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); -- 2.36.6