mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Ludovic Poitou
06.49.2010 6e1f91eb0f526a15c84067f78175d5be287a080e
* Include errors in statistics.
* Improve accuracy of -I option in authrate.
(sync from OpenDS, matthew_swift)
3 files modified
174 ■■■■■ changed files
sdk/src/com/sun/opends/sdk/tools/AuthRate.java 105 ●●●●● patch | view | raw | blame | history
sdk/src/com/sun/opends/sdk/tools/PerformanceRunner.java 65 ●●●●● patch | view | raw | blame | history
sdk/src/com/sun/opends/sdk/tools/SearchRate.java 4 ●●●● patch | view | raw | blame | history
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);
        }
        else
        if (error.getResult().getResultCode() == ResultCode.INVALID_CREDENTIALS)
        {
          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,11 +201,30 @@
        }
      }
      private FutureResult<BindResult> performBind(
          final AsynchronousConnection connection,
          final Object[] data,
          final AsynchronousConnection connection, final Object[] data,
          final ResultHandler<? super BindResult> handler)
      {
        final boolean useInvalidPassword;
        // Avoid rng if possible.
        switch (invalidCredPercent)
        {
        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;
@@ -206,10 +238,9 @@
          {
            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
          {
@@ -229,19 +260,17 @@
          {
            if(o.getAuthenticationID() != null)
            {
              sbr.setAuthenticationID(
                  String.format(o.getAuthenticationID(), data));
              sbr.setAuthenticationID(String.format(o.getAuthenticationID(),
                  data));
            }
            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
          {
@@ -259,13 +288,11 @@
          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
          {
@@ -285,19 +312,17 @@
          {
            if(o.getAuthenticationID() != null)
            {
              sbr.setAuthenticationID(
                  String.format(o.getAuthenticationID(), data));
              sbr.setAuthenticationID(String.format(o.getAuthenticationID(),
                  data));
            }
            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
          {
@@ -331,19 +356,17 @@
          {
            if(o.getAuthenticationID() != null)
            {
              sbr.setAuthenticationID(
                  String.format(o.getAuthenticationID(), data));
              sbr.setAuthenticationID(String.format(o.getAuthenticationID(),
                  data));
            }
            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
          {
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,15 +412,27 @@
    public void handleErrorResult(final ErrorResultException error)
    {
      failedRecentCount.getAndIncrement();
      updateStats();
      if (app.isVerbose())
      {
      app.println(LocalizableMessage.raw(error.getResult().toString()));
    }
    }
    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)
      {
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);
      }