From 4cd24d89f5881d8e2091d829d560d15fdcc76104 Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Sat, 06 Nov 2010 12:49:21 +0000
Subject: [PATCH] * Include errors in statistics. * Improve accuracy of -I option in authrate. (sync from OpenDS, matthew_swift)
---
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java | 67 ++++++++++------
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/AuthRate.java | 169 ++++++++++++++++++++++++------------------
opendj-sdk/sdk/src/com/sun/opends/sdk/tools/SearchRate.java | 4
3 files changed, 138 insertions(+), 102 deletions(-)
diff --git a/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/AuthRate.java b/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/AuthRate.java
index 508ab01..d5c4fca 100644
--- a/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/AuthRate.java
+++ b/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/AuthRate.java
@@ -38,6 +38,7 @@
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
+import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
@@ -85,22 +86,25 @@
}
}
- private final class BindUpdateStatsResultHandler
- extends UpdateStatsResultHandler<BindResult>
+
+
+ private final class BindUpdateStatsResultHandler extends
+ UpdateStatsResultHandler<BindResult>
{
- private BindUpdateStatsResultHandler(long eTime) {
- super(eTime);
+ private BindUpdateStatsResultHandler(long startTime)
+ {
+ super(startTime);
}
+
+
@Override
- public void handleErrorResult(ErrorResultException error) {
- if(error.getResult().getResultCode() != ResultCode.INVALID_CREDENTIALS)
+ public void handleErrorResult(ErrorResultException error)
+ {
+ super.handleErrorResult(error);
+
+ if (error.getResult().getResultCode() == ResultCode.INVALID_CREDENTIALS)
{
- super.handleErrorResult(error);
- }
- else
- {
- failedRecentCount.getAndIncrement();
invalidCredRecentCount.getAndIncrement();
}
}
@@ -110,9 +114,18 @@
{
private SearchRequest sr;
private BindRequest br;
-
private Object[] data;
+ private final char[] invalidPassword = "invalid-password".toCharArray();
+ private final ThreadLocal<Random> rng = new ThreadLocal<Random>()
+ {
+
+ protected Random initialValue()
+ {
+ return new Random();
+ }
+
+ };
private BindWorkerThread(final AsynchronousConnection connection,
@@ -188,162 +201,172 @@
}
}
+
+
private FutureResult<BindResult> performBind(
- final AsynchronousConnection connection,
- final Object[] data,
+ final AsynchronousConnection connection, final Object[] data,
final ResultHandler<? super BindResult> handler)
{
- if(bindRequest instanceof SimpleBindRequest)
+ final boolean useInvalidPassword;
+
+ // Avoid rng if possible.
+ switch (invalidCredPercent)
{
- SimpleBindRequest o = (SimpleBindRequest)bindRequest;
- if(br == null)
+ case 0:
+ useInvalidPassword = false;
+ break;
+ case 100:
+ useInvalidPassword = true;
+ break;
+ default:
+ final Random r = rng.get();
+ final int p = r.nextInt(100);
+ useInvalidPassword = (p < invalidCredPercent);
+ break;
+ }
+
+ if (bindRequest instanceof SimpleBindRequest)
+ {
+ SimpleBindRequest o = (SimpleBindRequest) bindRequest;
+ if (br == null)
{
br = Requests.copyOfSimpleBindRequest(o);
}
- SimpleBindRequest sbr = (SimpleBindRequest)br;
+ SimpleBindRequest sbr = (SimpleBindRequest) br;
if (data != null && o.getName() != null)
{
sbr.setName(String.format(o.getName(), data));
}
- if(successRecentCount.get() * ((float)invalidCredPercent/100) >
- invalidCredRecentCount.get())
+ if (useInvalidPassword)
{
- sbr.setPassword("invalid-password".toCharArray());
+ sbr.setPassword(invalidPassword);
}
else
{
sbr.setPassword(o.getPassword());
}
}
- else if(bindRequest instanceof DigestMD5SASLBindRequest)
+ else if (bindRequest instanceof DigestMD5SASLBindRequest)
{
- DigestMD5SASLBindRequest o = (DigestMD5SASLBindRequest)bindRequest;
- if(br == null)
+ DigestMD5SASLBindRequest o = (DigestMD5SASLBindRequest) bindRequest;
+ if (br == null)
{
br = Requests.copyOfDigestMD5SASLBindRequest(o);
}
- DigestMD5SASLBindRequest sbr = (DigestMD5SASLBindRequest)br;
+ DigestMD5SASLBindRequest sbr = (DigestMD5SASLBindRequest) br;
if (data != null)
{
- if(o.getAuthenticationID() != null)
+ if (o.getAuthenticationID() != null)
{
- sbr.setAuthenticationID(
- String.format(o.getAuthenticationID(), data));
+ sbr.setAuthenticationID(String.format(o.getAuthenticationID(),
+ data));
}
- if(o.getAuthorizationID() != null)
+ if (o.getAuthorizationID() != null)
{
- sbr.setAuthorizationID(
- String.format(o.getAuthorizationID(), data));
+ sbr.setAuthorizationID(String.format(o.getAuthorizationID(), data));
}
}
- if(successRecentCount.get() * ((float)invalidCredPercent/100) >
- invalidCredRecentCount.get())
+ if (useInvalidPassword)
{
- sbr.setPassword("invalid-password".toCharArray());
+ sbr.setPassword(invalidPassword);
}
else
{
sbr.setPassword(o.getPassword());
}
}
- else if(bindRequest instanceof CRAMMD5SASLBindRequest)
+ else if (bindRequest instanceof CRAMMD5SASLBindRequest)
{
- CRAMMD5SASLBindRequest o = (CRAMMD5SASLBindRequest)bindRequest;
- if(br == null)
+ CRAMMD5SASLBindRequest o = (CRAMMD5SASLBindRequest) bindRequest;
+ if (br == null)
{
br = Requests.copyOfCRAMMD5SASLBindRequest(o);
}
- CRAMMD5SASLBindRequest sbr = (CRAMMD5SASLBindRequest)br;
+ CRAMMD5SASLBindRequest sbr = (CRAMMD5SASLBindRequest) br;
if (data != null && o.getAuthenticationID() != null)
{
- sbr.setAuthenticationID(
- String.format(o.getAuthenticationID(), data));
+ sbr.setAuthenticationID(String.format(o.getAuthenticationID(), data));
}
- if(successRecentCount.get() * ((float)invalidCredPercent/100) >
- invalidCredRecentCount.get())
+ if (useInvalidPassword)
{
- sbr.setPassword("invalid-password".toCharArray());
+ sbr.setPassword(invalidPassword);
}
else
{
sbr.setPassword(o.getPassword());
}
}
- else if(bindRequest instanceof GSSAPISASLBindRequest)
+ else if (bindRequest instanceof GSSAPISASLBindRequest)
{
- GSSAPISASLBindRequest o = (GSSAPISASLBindRequest)bindRequest;
- if(br == null)
+ GSSAPISASLBindRequest o = (GSSAPISASLBindRequest) bindRequest;
+ if (br == null)
{
br = Requests.copyOfGSSAPISASLBindRequest(o);
}
- GSSAPISASLBindRequest sbr = (GSSAPISASLBindRequest)br;
+ GSSAPISASLBindRequest sbr = (GSSAPISASLBindRequest) br;
if (data != null)
{
- if(o.getAuthenticationID() != null)
+ if (o.getAuthenticationID() != null)
{
- sbr.setAuthenticationID(
- String.format(o.getAuthenticationID(), data));
+ sbr.setAuthenticationID(String.format(o.getAuthenticationID(),
+ data));
}
- if(o.getAuthorizationID() != null)
+ if (o.getAuthorizationID() != null)
{
- sbr.setAuthorizationID(
- String.format(o.getAuthorizationID(), data));
+ sbr.setAuthorizationID(String.format(o.getAuthorizationID(), data));
}
}
- if(successRecentCount.get() * ((float)invalidCredPercent/100) >
- invalidCredRecentCount.get())
+ if (useInvalidPassword)
{
- sbr.setPassword("invalid-password".toCharArray());
+ sbr.setPassword(invalidPassword);
}
else
{
sbr.setPassword(o.getPassword());
}
}
- else if(bindRequest instanceof ExternalSASLBindRequest)
+ else if (bindRequest instanceof ExternalSASLBindRequest)
{
- ExternalSASLBindRequest o = (ExternalSASLBindRequest)bindRequest;
- if(br == null)
+ ExternalSASLBindRequest o = (ExternalSASLBindRequest) bindRequest;
+ if (br == null)
{
br = Requests.copyOfExternalSASLBindRequest(o);
}
- ExternalSASLBindRequest sbr = (ExternalSASLBindRequest)br;
+ ExternalSASLBindRequest sbr = (ExternalSASLBindRequest) br;
if (data != null && o.getAuthorizationID() != null)
{
sbr.setAuthorizationID(String.format(o.getAuthorizationID(), data));
}
}
- else if(bindRequest instanceof PlainSASLBindRequest)
+ else if (bindRequest instanceof PlainSASLBindRequest)
{
- PlainSASLBindRequest o = (PlainSASLBindRequest)bindRequest;
- if(br == null)
+ PlainSASLBindRequest o = (PlainSASLBindRequest) bindRequest;
+ if (br == null)
{
br = Requests.copyOfPlainSASLBindRequest(o);
}
- PlainSASLBindRequest sbr = (PlainSASLBindRequest)br;
+ PlainSASLBindRequest sbr = (PlainSASLBindRequest) br;
if (data != null)
{
- if(o.getAuthenticationID() != null)
+ if (o.getAuthenticationID() != null)
{
- sbr.setAuthenticationID(
- String.format(o.getAuthenticationID(), data));
+ sbr.setAuthenticationID(String.format(o.getAuthenticationID(),
+ data));
}
- if(o.getAuthorizationID() != null)
+ if (o.getAuthorizationID() != null)
{
- sbr.setAuthorizationID(
- String.format(o.getAuthorizationID(), data));
+ sbr.setAuthorizationID(String.format(o.getAuthorizationID(), data));
}
}
- if(successRecentCount.get() * ((float)invalidCredPercent/100) >
- invalidCredRecentCount.get())
+ if (useInvalidPassword)
{
- sbr.setPassword("invalid-password".toCharArray());
+ sbr.setPassword(invalidPassword);
}
else
{
diff --git a/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java b/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java
index 6243f24..b4c5300 100644
--- a/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java
+++ b/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java
@@ -78,7 +78,7 @@
protected int successCount;
- protected int searchCount;
+ protected int operationCount;
protected int failedCount;
@@ -236,36 +236,45 @@
gcDuration += bean.getCollectionTime();
}
+ operationCount = operationRecentCount.getAndSet(0);
successCount = successRecentCount.getAndSet(0);
- searchCount = operationRecentCount.getAndSet(0);
failedCount = failedRecentCount.getAndSet(0);
waitTime = waitRecentTime.getAndSet(0);
+
+ final int resultCount = successCount + failedCount;
+
+ totalOperationCount += operationCount;
totalSuccessCount += successCount;
- totalOperationCount += searchCount;
totalFailedCount += failedCount;
totalWaitTime += waitTime;
+
+ final long totalResultCount = totalSuccessCount + totalFailedCount;
+
recentDuration = statTime - lastStatTime;
averageDuration = statTime - startTime;
recentDuration -= gcDuration - lastGCDuration;
averageDuration -= gcDuration;
recentDuration /= 1000.0;
averageDuration /= 1000.0;
- strings[0] = String.format("%.1f", successCount / recentDuration);
- strings[1] = String.format("%.1f", totalSuccessCount / averageDuration);
- if (successCount > 0)
+
+ strings[0] = String.format("%.1f", resultCount / recentDuration);
+ strings[1] = String.format("%.1f", totalResultCount / averageDuration);
+
+ if (resultCount > 0)
{
strings[2] = String.format("%.3f",
(waitTime - (gcDuration - lastGCDuration))
- / (double) successCount / 1000000.0);
+ / (double) resultCount / 1000000.0);
}
else
{
strings[2] = "-";
}
- if (totalSuccessCount > 0)
+
+ if (totalResultCount > 0)
{
strings[3] = String.format("%.3f", (totalWaitTime - gcDuration)
- / (double) totalSuccessCount / 1000000.0);
+ / (double) totalResultCount / 1000000.0);
}
else
{
@@ -323,7 +332,7 @@
else
{
index = array.size()
- - (int) Math.floor((percent / 100.0) * totalSuccessCount) - 1;
+ - (int) Math.floor((percent / 100.0) * totalResultCount) - 1;
if (index < 0)
{
strings[i++] = String.format("*%.3f", array.get(0) / 1000000.0);
@@ -335,14 +344,13 @@
}
}
}
- strings[i++] = String
- .format("%.1f", totalFailedCount / averageDuration);
+ strings[i++] = String.format("%.1f", failedCount / recentDuration);
if (isAsync)
{
- if (successCount > 0)
+ if (resultCount > 0)
{
- strings[i++] = String.format("%.1f", (double) searchCount
- / successCount);
+ strings[i++] = String.format("%.1f", (double) operationCount
+ / resultCount);
}
else
{
@@ -390,20 +398,13 @@
*/
class UpdateStatsResultHandler<S extends Result> implements ResultHandler<S>
{
- private long eTime;
+ private final long startTime;
- UpdateStatsResultHandler(final long eTime)
+ UpdateStatsResultHandler(final long startTime)
{
- this.eTime = eTime;
- }
-
-
-
- public long getETime()
- {
- return eTime;
+ this.startTime = startTime;
}
@@ -411,7 +412,12 @@
public void handleErrorResult(final ErrorResultException error)
{
failedRecentCount.getAndIncrement();
- app.println(LocalizableMessage.raw(error.getResult().toString()));
+ updateStats();
+
+ if (app.isVerbose())
+ {
+ app.println(LocalizableMessage.raw(error.getResult().toString()));
+ }
}
@@ -419,7 +425,14 @@
public void handleResult(final S result)
{
successRecentCount.getAndIncrement();
- eTime = System.nanoTime() - eTime;
+ updateStats();
+ }
+
+
+
+ private void updateStats()
+ {
+ final long eTime = System.nanoTime() - startTime;
waitRecentTime.getAndAdd(eTime);
synchronized (this)
{
diff --git a/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/SearchRate.java b/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/SearchRate.java
index 0cf7174..30613fe 100644
--- a/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/SearchRate.java
+++ b/opendj-sdk/sdk/src/com/sun/opends/sdk/tools/SearchRate.java
@@ -60,9 +60,9 @@
private final class SearchStatsHandler extends
UpdateStatsResultHandler<Result> implements SearchResultHandler
{
- private SearchStatsHandler(final long eTime)
+ private SearchStatsHandler(final long startTime)
{
- super(eTime);
+ super(startTime);
}
--
Gitblit v1.10.0