From 85eed99dc29d3d7c557db102eea9d0441a9c665c Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Wed, 23 Jul 2014 14:40:02 +0000
Subject: [PATCH] OPENDJ-1074 (CR-4030) Implement combined add/del rate tool Adding an add/del rate tool named addrate. -opendj-core     ** EntryGenerator.java:     * Changing the subtemplate parsing behavior, add the "generated branches" options     ** TemplateFile.java     * Adding the "generated branches" options     ** addrate.template     * New template used to generate entries

---
 opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/PerformanceRunner.java |   86 ++++++++++++++-----------------------------
 1 files changed, 28 insertions(+), 58 deletions(-)

diff --git a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/PerformanceRunner.java b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/PerformanceRunner.java
index 3fd70e3..8398959 100644
--- a/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/PerformanceRunner.java
+++ b/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/PerformanceRunner.java
@@ -28,6 +28,7 @@
 package com.forgerock.opendj.ldap.tools;
 
 import static org.forgerock.util.Utils.closeSilently;
+import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
 
 import java.io.IOException;
 import java.lang.management.GarbageCollectorMXBean;
@@ -70,39 +71,22 @@
      */
     class StatsThread extends Thread {
         private final String[] additionalColumns;
-
         private final List<GarbageCollectorMXBean> beans;
-
         private final Set<Double> percentiles;
-
         private final int numColumns;
-
         private ReversableArray etimes = new ReversableArray(100000);
-
         private final ReversableArray array = new ReversableArray(200000);
-
         protected long totalSuccessCount;
-
         protected long totalOperationCount;
-
         protected long totalFailedCount;
-
         protected long totalWaitTime;
-
         protected int successCount;
-
         protected int operationCount;
-
         protected int failedCount;
-
         protected long waitTime;
-
         protected long lastStatTime;
-
         protected long lastGCDuration;
-
         protected double recentDuration;
-
         protected double averageDuration;
 
         public StatsThread(final String[] additionalColumns) {
@@ -351,10 +335,10 @@
      *            The type of expected result.
      */
     class UpdateStatsResultHandler<S extends Result> implements ResultHandler<S> {
-        private final long startTime;
+        protected final long currentTime;
 
-        UpdateStatsResultHandler(final long startTime) {
-            this.startTime = startTime;
+        UpdateStatsResultHandler(final long currentTime) {
+            this.currentTime = currentTime;
         }
 
         @Override
@@ -371,7 +355,7 @@
         }
 
         private void updateStats() {
-            final long eTime = System.nanoTime() - startTime;
+            final long eTime = System.nanoTime() - currentTime;
             waitRecentTime.getAndAdd(eTime);
             synchronized (this) {
                 final ReversableArray array = eTimeBuffer.get();
@@ -451,7 +435,9 @@
                 count++;
                 if (!isAsync) {
                     try {
-                        future.get();
+                        if (future != null) {
+                            future.get();
+                        }
                     } catch (final InterruptedException e) {
                         // Ignore and check stop requested
                         continue;
@@ -603,20 +589,15 @@
     }
 
     private static final String[] EMPTY_STRINGS = new String[0];
-
     private final AtomicInteger operationRecentCount = new AtomicInteger();
-
     protected final AtomicInteger successRecentCount = new AtomicInteger();
-
     protected final AtomicInteger failedRecentCount = new AtomicInteger();
-
     private final AtomicLong waitRecentTime = new AtomicLong();
 
     private final AtomicReference<ReversableArray> eTimeBuffer =
             new AtomicReference<ReversableArray>(new ReversableArray(100000));
 
     private final ConsoleApplication app;
-
     private DataSource[] dataSourcePrototypes;
 
     // Thread local copies of the data sources
@@ -638,51 +619,34 @@
     };
 
     private volatile boolean stopRequested;
-
     private int numThreads;
-
     private int numConnections;
-
     private int targetThroughput;
-
     private int maxIterations;
-
     private boolean isAsync;
-
     private boolean noRebind;
-
     private int statsInterval;
-
     private final IntegerArgument numThreadsArgument;
-
     private final IntegerArgument maxIterationsArgument;
-
     private final IntegerArgument statsIntervalArgument;
-
     private final IntegerArgument targetThroughputArgument;
-
     private final IntegerArgument numConnectionsArgument;
-
     private final IntegerArgument percentilesArgument;
-
     private final BooleanArgument keepConnectionsOpen;
-
     private final BooleanArgument noRebindArgument;
-
     private final BooleanArgument asyncArgument;
-
     private final StringArgument arguments;
 
-    PerformanceRunner(final ArgumentParser argParser, final ConsoleApplication app,
-            final boolean neverRebind, final boolean neverAsynchronous,
-            final boolean alwaysSingleThreaded) throws ArgumentException {
-        this.app = app;
+    PerformanceRunner(final PerformanceRunnerOptions options) throws ArgumentException {
+        ArgumentParser argParser = options.getArgumentParser();
+
+        this.app = options.getConsoleApplication();
         numThreadsArgument =
                 new IntegerArgument("numThreads", 't', "numThreads", false, false, true,
                         LocalizableMessage.raw("{numThreads}"), 1, null, true, 1, false, 0,
                         LocalizableMessage.raw("Number of worker threads per connection"));
         numThreadsArgument.setPropertyName("numThreads");
-        if (!alwaysSingleThreaded) {
+        if (options.supportsMultipleThreadsPerConnection()) {
             argParser.addArgument(numThreadsArgument);
         } else {
             numThreadsArgument.addValue("1");
@@ -735,7 +699,7 @@
                 new BooleanArgument("noRebind", 'F', "noRebind", LocalizableMessage
                         .raw("Keep connections open and don't rebind"));
         noRebindArgument.setPropertyName("noRebind");
-        if (!neverRebind) {
+        if (options.supportsRebind()) {
             argParser.addArgument(noRebindArgument);
         }
 
@@ -744,7 +708,7 @@
                         .raw("Use asynchronous mode and don't "
                                 + "wait for results before sending the next request"));
         asyncArgument.setPropertyName("asynchronous");
-        if (!neverAsynchronous) {
+        if (options.supportsAsynchronousRequests()) {
             argParser.addArgument(asyncArgument);
         }
 
@@ -767,7 +731,9 @@
                                         + "arguments, they can be generated per iteration with the "
                                         + "following functions: " + StaticUtils.EOL
                                         + DataSource.getUsage()));
-        argParser.addArgument(arguments);
+        if (options.supportsGeneratorArgument()) {
+            argParser.addArgument(arguments);
+        }
     }
 
     @Override
@@ -804,15 +770,19 @@
         noRebind = noRebindArgument.isPresent();
 
         if (!noRebindArgument.isPresent() && this.numThreads > 1) {
-            throw new ArgumentException(LocalizableMessage.raw("--"
-                    + noRebindArgument.getLongIdentifier() + " must be used if --"
-                    + numThreadsArgument.getLongIdentifier() + " is > 1"));
+            throw new ArgumentException(ERR_TOOL_ARG_MUST_BE_USED_WHEN_ARG_CONDITION.get(
+                "--" + noRebindArgument.getLongIdentifier(), "--" + numThreadsArgument.getLongIdentifier(), "> 1"));
         }
 
         if (!noRebindArgument.isPresent() && asyncArgument.isPresent()) {
-            throw new ArgumentException(LocalizableMessage.raw("--"
-                    + noRebindArgument.getLongIdentifier() + " must be used when using --"
-                    + asyncArgument.getLongIdentifier()));
+            throw new ArgumentException(ERR_TOOL_ARG_NEEDED_WHEN_USING_ARG.get(
+                "--" + noRebindArgument.getLongIdentifier(), asyncArgument.getLongIdentifier()));
+        }
+
+        if (maxIterationsArgument.isPresent() && maxIterations <= 0) {
+            throw new ArgumentException(ERR_TOOL_NOT_ENOUGH_ITERATIONS.get(
+                "--" + maxIterationsArgument.getLongIdentifier(), numConnections * numThreads,
+                numConnectionsArgument.getLongIdentifier(), numThreadsArgument.getLongIdentifier()));
         }
 
         dataSourcePrototypes = DataSource.parse(arguments.getValues());

--
Gitblit v1.10.0