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