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