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

neil_a_wilson
18.01.2006 275e21eb2b5b06d291a44f3a485cf62bc927fc52
Update the LDAP connection handler and LDAP client connection to properly
update the abandon operation count when appropriate. Also, update a number of
test cases to verify that the LDAPStatistics information is properly updated.

OpenDS Issue Number: 1116
10 files modified
902 ■■■■■ changed files
opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java 32 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java 16 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/protocols/ldap/LDAPStatistics.java 684 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java 77 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java 18 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/CompareOperationTestCase.java 6 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java 18 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/OperationTestCase.java 30 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java 14 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestModifyDNOperation.java 7 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
@@ -1312,7 +1312,15 @@
      {
        if (ps.getSearchOperation().getMessageID() == messageID)
        {
          return ps.getSearchOperation().cancel(cancelRequest);
          CancelResult cancelResult =
               ps.getSearchOperation().cancel(cancelRequest);
          if (keepStats && (cancelResult == CancelResult.CANCELED))
          {
            statTracker.updateAbandonedOperation();
          }
          return cancelResult;
        }
      }
@@ -1320,6 +1328,12 @@
    }
    else
    {
      CancelResult cancelResult = op.cancel(cancelRequest);
      if (keepStats && (cancelResult == CancelResult.CANCELED))
      {
        statTracker.updateAbandonedOperation();
      }
      return op.cancel(cancelRequest);
    }
  }
@@ -1347,7 +1361,11 @@
      {
        try
        {
          o.cancel(cancelRequest);
          CancelResult cancelResult = o.cancel(cancelRequest);
          if (keepStats && (cancelResult == CancelResult.CANCELED))
          {
            statTracker.updateAbandonedOperation();
          }
        }
        catch (Exception e)
        {
@@ -1408,7 +1426,11 @@
        {
          try
          {
            o.cancel(cancelRequest);
            CancelResult cancelResult = o.cancel(cancelRequest);
            if (keepStats && (cancelResult == CancelResult.CANCELED))
            {
              statTracker.updateAbandonedOperation();
            }
          }
          catch (Exception e)
          {
@@ -1848,6 +1870,10 @@
                              protocolOp.getIDToAbandon());
    abandonOp.run();
    if (keepStats && (abandonOp.getResultCode() == ResultCode.CANCELED))
    {
      statTracker.updateAbandonedOperation();
    }
    return connectionValid;
  }
opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
@@ -1605,6 +1605,22 @@
  /**
   * Indicates whether this connection handler should use SSL to communicate
   * with clients.
   *
   * @return  {@code true} if this connection handler should use SSL to
   *          communicate with clients, or {@code false} if not.
   */
  public boolean useSSL()
  {
    assert debugEnter(CLASS_NAME, "useSSL");
    return useSSL;
  }
  /**
   * Retrieves the SSL client authentication policy for this connection handler.
   *
   * @return  The SSL client authentication policy for this connection handler.
opends/src/server/org/opends/server/protocols/ldap/LDAPStatistics.java
@@ -918,5 +918,689 @@
    return new Attribute(attrType, name, values);
  }
  /**
   * Retrieves the number of client connections that have been established.
   *
   * @return  The number of client connections that have been established.
   */
  public long getConnectionsEstablished()
  {
    assert debugEnter(CLASS_NAME, "getConnectionsEstablished");
    connectLock.lock();
    try
    {
      return connectionsEstablished;
    }
    finally
    {
      connectLock.unlock();
    }
  }
  /**
   * Retrieves the number of client connections that have been closed.
   *
   * @return  The number of client connections that have been closed.
   */
  public long getConnectionsClosed()
  {
    assert debugEnter(CLASS_NAME, "getConnectionsClosed");
    disconnectLock.lock();
    try
    {
      return connectionsClosed;
    }
    finally
    {
      disconnectLock.unlock();
    }
  }
  /**
   * Retrieves the number of bytes that have been received from clients.
   *
   * @return  The number of bytes that have been received from clients.
   */
  public long getBytesRead()
  {
    assert debugEnter(CLASS_NAME, "getBytesRead");
    readLock.lock();
    try
    {
      return bytesRead;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of bytes that have been written to clients.
   *
   * @return  The number of bytes that have been written to clients.
   */
  public long getBytesWritten()
  {
    assert debugEnter(CLASS_NAME, "getBytesWritten");
    writeLock.lock();
    try
    {
      return bytesWritten;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of LDAP messages that have been received from clients.
   *
   * @return  The number of LDAP messages that have been received from clients.
   */
  public long getMessagesRead()
  {
    assert debugEnter(CLASS_NAME, "getMessagesRead");
    readLock.lock();
    try
    {
      return messagesRead;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of LDAP messages that have been written to clients.
   *
   * @return  The number of LDAP messages that have been written to clients.
   */
  public long getMessagesWritten()
  {
    assert debugEnter(CLASS_NAME, "getMessagesWritten");
    writeLock.lock();
    try
    {
      return messagesWritten;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of operations that have been initiated by clients.
   *
   * @return  The number of operations that have been initiated by clients.
   */
  public long getOperationsInitiated()
  {
    assert debugEnter(CLASS_NAME, "getOperationsInitiated");
    readLock.lock();
    try
    {
      return operationsInitiated;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of operations for which the server has completed
   * processing.
   *
   * @return  The number of operations for which the server has completed
   *          processing.
   */
  public long getOperationsCompleted()
  {
    assert debugEnter(CLASS_NAME, "getOperationsCompleted");
    writeLock.lock();
    try
    {
      return operationsCompleted;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of operations that have been abandoned by clients.
   *
   * @return  The number of operations that have been abandoned by clients.
   */
  public long getOperationsAbandoned()
  {
    assert debugEnter(CLASS_NAME, "getOperationsAbandoned");
    abandonLock.lock();
    try
    {
      return operationsAbandoned;
    }
    finally
    {
      abandonLock.unlock();
    }
  }
  /**
   * Retrieves the number of abandon requests that have been received.
   *
   * @return  The number of abandon requests that have been received.
   */
  public long getAbandonRequests()
  {
    assert debugEnter(CLASS_NAME, "getAbandonRequests");
    readLock.lock();
    try
    {
      return abandonRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of add requests that have been received.
   *
   * @return  The number of add requests that have been received.
   */
  public long getAddRequests()
  {
    assert debugEnter(CLASS_NAME, "getAddRequests");
    readLock.lock();
    try
    {
      return addRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of add responses that have been sent.
   *
   * @return  The number of add responses that have been sent.
   */
  public long getAddResponses()
  {
    assert debugEnter(CLASS_NAME, "getAddResponses");
    writeLock.lock();
    try
    {
      return addResponses;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of bind requests that have been received.
   *
   * @return  The number of bind requests that have been received.
   */
  public long getBindRequests()
  {
    assert debugEnter(CLASS_NAME, "getBindRequests");
    readLock.lock();
    try
    {
      return bindRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of bind responses that have been sent.
   *
   * @return  The number of bind responses that have been sent.
   */
  public long getBindResponses()
  {
    assert debugEnter(CLASS_NAME, "getBindResponses");
    writeLock.lock();
    try
    {
      return bindResponses;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of compare requests that have been received.
   *
   * @return  The number of compare requests that have been received.
   */
  public long getCompareRequests()
  {
    assert debugEnter(CLASS_NAME, "getCompareRequests");
    readLock.lock();
    try
    {
      return compareRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of compare responses that have been sent.
   *
   * @return  The number of compare responses that have been sent.
   */
  public long getCompareResponses()
  {
    assert debugEnter(CLASS_NAME, "getCompareResponses");
    writeLock.lock();
    try
    {
      return compareResponses;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of delete requests that have been received.
   *
   * @return  The number of delete requests that have been received.
   */
  public long getDeleteRequests()
  {
    assert debugEnter(CLASS_NAME, "getDeleteRequests");
    readLock.lock();
    try
    {
      return deleteRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of delete responses that have been sent.
   *
   * @return  The number of delete responses that have been sent.
   */
  public long getDeleteResponses()
  {
    assert debugEnter(CLASS_NAME, "getDeleteResponses");
    writeLock.lock();
    try
    {
      return deleteResponses;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of extended requests that have been received.
   *
   * @return  The number of extended requests that have been received.
   */
  public long getExtendedRequests()
  {
    assert debugEnter(CLASS_NAME, "getExtendedRequests");
    readLock.lock();
    try
    {
      return extendedRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of extended responses that have been sent.
   *
   * @return  The number of extended responses that have been sent.
   */
  public long getExtendedResponses()
  {
    assert debugEnter(CLASS_NAME, "getExtendedResponses");
    writeLock.lock();
    try
    {
      return extendedResponses;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of modify requests that have been received.
   *
   * @return  The number of modify requests that have been received.
   */
  public long getModifyRequests()
  {
    assert debugEnter(CLASS_NAME, "getModifyRequests");
    readLock.lock();
    try
    {
      return modifyRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of modify responses that have been sent.
   *
   * @return  The number of modify responses that have been sent.
   */
  public long getModifyResponses()
  {
    assert debugEnter(CLASS_NAME, "getModifyResponses");
    writeLock.lock();
    try
    {
      return modifyResponses;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of modify DN requests that have been received.
   *
   * @return  The number of modify DN requests that have been received.
   */
  public long getModifyDNRequests()
  {
    assert debugEnter(CLASS_NAME, "getModifyDNRequests");
    readLock.lock();
    try
    {
      return modifyDNRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of modify DN responses that have been sent.
   *
   * @return  The number of modify DN responses that have been sent.
   */
  public long getModifyDNResponses()
  {
    assert debugEnter(CLASS_NAME, "getModifyDNResponses");
    writeLock.lock();
    try
    {
      return modifyDNResponses;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of search requests that have been received.
   *
   * @return  The number of search requests that have been received.
   */
  public long getSearchRequests()
  {
    assert debugEnter(CLASS_NAME, "getSearchRequests");
    readLock.lock();
    try
    {
      return searchRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the number of search result entries that have been sent.
   *
   * @return  The number of search result entries that have been sent.
   */
  public long getSearchResultEntries()
  {
    assert debugEnter(CLASS_NAME, "getSearchResultEntries");
    writeLock.lock();
    try
    {
      return searchResultEntries;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of search result references that have been sent.
   *
   * @return  The number of search result references that have been sent.
   */
  public long getSearchResultReferences()
  {
    assert debugEnter(CLASS_NAME, "getSearchResultReferences");
    writeLock.lock();
    try
    {
      return searchResultReferences;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of search result done messages that have been sent.
   *
   * @return  The number of search result done messages that have been sent.
   */
  public long getSearchResultsDone()
  {
    assert debugEnter(CLASS_NAME, "getSearchResultsDone");
    writeLock.lock();
    try
    {
      return searchResultsDone;
    }
    finally
    {
      writeLock.unlock();
    }
  }
  /**
   * Retrieves the number of unbind requests that have been received.
   *
   * @return  The number of unbind requests that have been received.
   */
  public long getUnbindRequests()
  {
    assert debugEnter(CLASS_NAME, "getUnbindRequests");
    readLock.lock();
    try
    {
      return unbindRequests;
    }
    finally
    {
      readLock.unlock();
    }
  }
  /**
   * Retrieves the parent statistics tracker that will also be updated whenever
   * this tracker is updated.
   *
   * @return  The parent statistics tracker, or {@code null} if there is none.
   */
  public LDAPStatistics getParent()
  {
    assert debugEnter(CLASS_NAME, "getParent");
    return parent;
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/core/AbandonOperationTestCase.java
@@ -311,6 +311,10 @@
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    long abandonRequests   = ldapStatistics.getAbandonRequests();
    long abandonsCompleted = ldapStatistics.getOperationsAbandoned();
    // Create an add request and send it to the server.  Make sure to include
    // the delay request control so it won't complete before we can send the
    // abandon request.
@@ -346,6 +350,9 @@
    AddResponseProtocolOp addResponse = message.getAddResponseProtocolOp();
    assertEquals(addResponse.getResultCode(), LDAPResultCode.CANCELED);
    assertEquals(ldapStatistics.getAbandonRequests(), abandonRequests+1);
    waitForAbandon(abandonsCompleted+1);
    s.close();
    assertTrue(InvocationCounterPlugin.getPostConnectCount() > 0);
@@ -384,6 +391,10 @@
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    long abandonRequests   = ldapStatistics.getAbandonRequests();
    long abandonsCompleted = ldapStatistics.getOperationsAbandoned();
    // Create a compare request and send it to the server.  Make sure to include
    // the delay request control so it won't complete before we can send the
    // abandon request.
@@ -410,6 +421,9 @@
         message.getCompareResponseProtocolOp();
    assertEquals(compareResponse.getResultCode(), LDAPResultCode.CANCELED);
    assertEquals(ldapStatistics.getAbandonRequests(), abandonRequests+1);
    waitForAbandon(abandonsCompleted+1);
    s.close();
    assertTrue(InvocationCounterPlugin.getPostConnectCount() > 0);
@@ -462,6 +476,10 @@
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    long abandonRequests   = ldapStatistics.getAbandonRequests();
    long abandonsCompleted = ldapStatistics.getOperationsAbandoned();
    // Create a delete request and send it to the server.  Make sure to include
    // the delay request control so it won't complete before we can send the
    // abandon request.
@@ -487,6 +505,9 @@
         message.getDeleteResponseProtocolOp();
    assertEquals(deleteResponse.getResultCode(), LDAPResultCode.CANCELED);
    assertEquals(ldapStatistics.getAbandonRequests(), abandonRequests+1);
    waitForAbandon(abandonsCompleted+1);
    s.close();
    assertTrue(InvocationCounterPlugin.getPostConnectCount() > 0);
@@ -525,6 +546,10 @@
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    long abandonRequests   = ldapStatistics.getAbandonRequests();
    long abandonsCompleted = ldapStatistics.getOperationsAbandoned();
    // Create a "Who Am I?" extended oepration and send it to the server.  Make
    // sure to include the delay request control so it won't complete before we
    // can send the abandon request.
@@ -550,6 +575,9 @@
         message.getExtendedResponseProtocolOp();
    assertEquals(extendedResponse.getResultCode(), LDAPResultCode.CANCELED);
    assertEquals(ldapStatistics.getAbandonRequests(), abandonRequests+1);
    waitForAbandon(abandonsCompleted+1);
    s.close();
    assertTrue(InvocationCounterPlugin.getPostConnectCount() > 0);
@@ -588,6 +616,10 @@
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    long abandonRequests   = ldapStatistics.getAbandonRequests();
    long abandonsCompleted = ldapStatistics.getOperationsAbandoned();
    // Create a modify request and send it to the server.  Make sure to include
    // the delay request control so it won't complete before we can send the
    // abandon request.
@@ -620,6 +652,9 @@
         message.getModifyResponseProtocolOp();
    assertEquals(modifyResponse.getResultCode(), LDAPResultCode.CANCELED);
    assertEquals(ldapStatistics.getAbandonRequests(), abandonRequests+1);
    waitForAbandon(abandonsCompleted+1);
    s.close();
    assertTrue(InvocationCounterPlugin.getPostConnectCount() > 0);
@@ -672,6 +707,10 @@
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    long abandonRequests   = ldapStatistics.getAbandonRequests();
    long abandonsCompleted = ldapStatistics.getOperationsAbandoned();
    // Create a modify DN request and send it to the server.  Make sure to
    // include the delay request control so it won't complete before we can send
    // the abandon request.
@@ -698,6 +737,9 @@
         message.getModifyDNResponseProtocolOp();
    assertEquals(modifyDNResponse.getResultCode(), LDAPResultCode.CANCELED);
    assertEquals(ldapStatistics.getAbandonRequests(), abandonRequests+1);
    waitForAbandon(abandonsCompleted+1);
    s.close();
    assertTrue(InvocationCounterPlugin.getPostConnectCount() > 0);
@@ -736,6 +778,10 @@
    assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS);
    long abandonRequests   = ldapStatistics.getAbandonRequests();
    long abandonsCompleted = ldapStatistics.getOperationsAbandoned();
    // Create a search request and send it to the server.  Make sure to include
    // the delay request control so it won't complete before we can send the
    // abandon request.
@@ -766,10 +812,41 @@
         message.getSearchResultDoneProtocolOp();
    assertEquals(searchDone.getResultCode(), LDAPResultCode.CANCELED);
    assertEquals(ldapStatistics.getAbandonRequests(), abandonRequests+1);
    waitForAbandon(abandonsCompleted+1);
    s.close();
    assertTrue(InvocationCounterPlugin.getPostConnectCount() > 0);
    assertTrue(InvocationCounterPlugin.getPreParseCount() > 0);
  }
  /**
   * Waits up to ten seconds for the abandoned operation count to reach the
   * expected value.
   *
   * @param  expectedCount  The abandon count the server is expected to reach.
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  private void waitForAbandon(long expectedCount)
          throws Exception
  {
    long stopTime = System.currentTimeMillis() + 10000;
    while (System.currentTimeMillis() < stopTime)
    {
      if (ldapStatistics.getOperationsAbandoned() == expectedCount)
      {
        return;
      }
      Thread.sleep(10);
    }
    throw new AssertionError("Expected abandon count of " + expectedCount +
                   " but got " + ldapStatistics.getOperationsAbandoned());
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/core/AddOperationTestCase.java
@@ -855,6 +855,9 @@
    values.add(new ASN1OctetString("20060101000000Z"));
    attrs.add(new LDAPAttribute("createTimestamp", values));
    long addRequests  = ldapStatistics.getAddRequests();
    long addResponses = ldapStatistics.getAddResponses();
    AddRequestProtocolOp addRequest =
         new AddRequestProtocolOp(new ASN1OctetString("ou=People,o=test"),
                                  attrs);
@@ -866,6 +869,9 @@
         message.getAddResponseProtocolOp();
    assertFalse(addResponse.getResultCode() == 0);
    assertEquals(ldapStatistics.getAddRequests(), addRequests+1);
    assertEquals(ldapStatistics.getAddResponses(), addResponses+1);
    try
    {
      s.close();
@@ -1650,6 +1656,9 @@
    DirectoryServer.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
    long addRequests  = ldapStatistics.getAddRequests();
    long addResponses = ldapStatistics.getAddResponses();
    AddRequestProtocolOp addRequest =
         new AddRequestProtocolOp(new ASN1OctetString("ou=People,o=test"),
                                  attrs);
@@ -1661,6 +1670,9 @@
         message.getAddResponseProtocolOp();
    assertFalse(addResponse.getResultCode() == 0);
    assertEquals(ldapStatistics.getAddRequests(), addRequests+1);
    assertEquals(ldapStatistics.getAddResponses(), addResponses+1);
    try
    {
      s.close();
@@ -1796,6 +1808,9 @@
    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
    b.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
    long addRequests  = ldapStatistics.getAddRequests();
    long addResponses = ldapStatistics.getAddResponses();
    AddRequestProtocolOp addRequest =
         new AddRequestProtocolOp(new ASN1OctetString("ou=People,o=test"),
                                  attrs);
@@ -1807,6 +1822,9 @@
         message.getAddResponseProtocolOp();
    assertFalse(addResponse.getResultCode() == 0);
    assertEquals(ldapStatistics.getAddRequests(), addRequests+1);
    assertEquals(ldapStatistics.getAddResponses(), addResponses+1);
    try
    {
      s.close();
opends/tests/unit-tests-testng/src/server/org/opends/server/core/CompareOperationTestCase.java
@@ -635,6 +635,9 @@
      {
        InvocationCounterPlugin.resetAllCounters();
        long compareRequests  = ldapStatistics.getCompareRequests();
        long compareResponses = ldapStatistics.getCompareResponses();
        CompareRequestProtocolOp compareRequest =
          new CompareRequestProtocolOp(
               new ASN1OctetString(entry.getDN().toString()),
@@ -654,6 +657,9 @@
        assertEquals(InvocationCounterPlugin.getPostOperationCount(), 0);
        // The post response might not have been called yet.
        assertEquals(InvocationCounterPlugin.waitForPostResponse(), 1);
        assertEquals(ldapStatistics.getCompareRequests(), compareRequests+1);
        assertEquals(ldapStatistics.getCompareResponses(), compareResponses+1);
      } finally
      {
        LockManager.unlock(entry.getDN(), writeLock);
opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
@@ -3549,6 +3549,9 @@
    ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
    long modifyRequests  = ldapStatistics.getModifyRequests();
    long modifyResponses = ldapStatistics.getModifyResponses();
    ModifyRequestProtocolOp modifyRequest =
         new ModifyRequestProtocolOp(
                  new ASN1OctetString("uid=test.user," + baseDN), mods);
@@ -3559,6 +3562,9 @@
    ModifyResponseProtocolOp modifyResponse =
         message.getModifyResponseProtocolOp();
    assertFalse(modifyResponse.getResultCode() == 0);
    assertEquals(ldapStatistics.getModifyRequests(), modifyRequests+1);
    assertEquals(ldapStatistics.getModifyResponses(), modifyResponses+1);
  }
@@ -3737,6 +3743,9 @@
    ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
    mods.add(new LDAPModification(ModificationType.ADD, attr));
    long modifyRequests  = ldapStatistics.getModifyRequests();
    long modifyResponses = ldapStatistics.getModifyResponses();
    ModifyRequestProtocolOp modifyRequest =
         new ModifyRequestProtocolOp(
                  new ASN1OctetString("uid=test.user," + baseDN), mods);
@@ -3748,6 +3757,9 @@
         message.getModifyResponseProtocolOp();
    assertFalse(modifyResponse.getResultCode() == 0);
    assertEquals(ldapStatistics.getModifyRequests(), modifyRequests+1);
    assertEquals(ldapStatistics.getModifyResponses(), modifyResponses+1);
    DirectoryServer.setWritabilityMode(WritabilityMode.ENABLED);
  }
@@ -3930,6 +3942,9 @@
    ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
    mods.add(new LDAPModification(ModificationType.ADD, attr));
    long modifyRequests  = ldapStatistics.getModifyRequests();
    long modifyResponses = ldapStatistics.getModifyResponses();
    ModifyRequestProtocolOp modifyRequest =
         new ModifyRequestProtocolOp(
                  new ASN1OctetString("uid=test.user," + baseDN), mods);
@@ -3941,6 +3956,9 @@
         message.getModifyResponseProtocolOp();
    assertFalse(modifyResponse.getResultCode() == 0);
    assertEquals(ldapStatistics.getModifyRequests(), modifyRequests+1);
    assertEquals(ldapStatistics.getModifyResponses(), modifyResponses+1);
    b.setWritabilityMode(WritabilityMode.ENABLED);
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/core/OperationTestCase.java
@@ -33,6 +33,9 @@
import org.testng.annotations.Test;
import org.opends.server.TestCaseUtils;
import org.opends.server.api.ConnectionHandler;
import org.opends.server.protocols.ldap.LDAPConnectionHandler;
import org.opends.server.protocols.ldap.LDAPStatistics;
import org.opends.server.types.Control;
import org.opends.server.types.ResultCode;
@@ -46,6 +49,14 @@
public abstract class OperationTestCase
       extends CoreTestCase
{
  // The LDAPStatistics object associated with the LDAP connection handler.
  protected LDAPStatistics ldapStatistics;
  // The LDAPStatistics object associated with the LDAPS connection handler.
  protected LDAPStatistics ldapsStatistics;
  /**
   * Ensures that the Directory Server is running.
   *
@@ -56,6 +67,25 @@
         throws Exception
  {
    TestCaseUtils.startServer();
    for (ConnectionHandler ch : DirectoryServer.getConnectionHandlers())
    {
      if (ch instanceof LDAPConnectionHandler)
      {
        LDAPConnectionHandler lch = (LDAPConnectionHandler) ch;
        if (lch.useSSL())
        {
          ldapsStatistics = lch.getStatTracker();
        }
        else
        {
          ldapStatistics = lch.getStatTracker();
        }
      }
    }
    assertNotNull(ldapStatistics);
    assertNotNull(ldapsStatistics);
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
@@ -255,6 +255,11 @@
      InvocationCounterPlugin.resetAllCounters();
      long searchRequests   = ldapStatistics.getSearchRequests();
      long searchEntries    = ldapStatistics.getSearchResultEntries();
      long searchReferences = ldapStatistics.getSearchResultReferences();
      long searchesDone     = ldapStatistics.getSearchResultsDone();
      LDAPMessage message;
      message = new LDAPMessage(2, searchRequest, controls);
      w.writeElement(message.encode());
@@ -269,9 +274,11 @@
        {
          case LDAPConstants.OP_TYPE_SEARCH_RESULT_ENTRY:
            searchResultEntry = message.getSearchResultEntryProtocolOp();
            searchEntries++;
            break;
          case LDAPConstants.OP_TYPE_SEARCH_RESULT_REFERENCE:
            searchReferences++;
            break;
          case LDAPConstants.OP_TYPE_SEARCH_RESULT_DONE:
@@ -279,10 +286,17 @@
            assertEquals(searchResultDone.getResultCode(),
                         LDAPResultCode.SUCCESS);
            assertEquals(InvocationCounterPlugin.waitForPostResponse(), 1);
            searchesDone++;
            break;
        }
      }
      assertEquals(ldapStatistics.getSearchRequests(), searchRequests+1);
      assertEquals(ldapStatistics.getSearchResultEntries(), searchEntries);
      assertEquals(ldapStatistics.getSearchResultReferences(),
                   searchReferences);
      assertEquals(ldapStatistics.getSearchResultsDone(), searchesDone);
      return searchResultEntry;
    }
    finally
opends/tests/unit-tests-testng/src/server/org/opends/server/core/TestModifyDNOperation.java
@@ -1172,6 +1172,9 @@
      {
        InvocationCounterPlugin.resetAllCounters();
        long modifyDNRequests  = ldapStatistics.getModifyDNRequests();
        long modifyDNResponses = ldapStatistics.getModifyDNResponses();
        ModifyDNRequestProtocolOp modifyRequest =
          new ModifyDNRequestProtocolOp(
               new ASN1OctetString(entry.getDN().toString()),
@@ -1191,6 +1194,10 @@
        assertEquals(InvocationCounterPlugin.getPostOperationCount(), 0);
        // The post response might not have been called yet.
        assertEquals(InvocationCounterPlugin.waitForPostResponse(), 1);
        assertEquals(ldapStatistics.getModifyDNRequests(), modifyDNRequests+1);
        assertEquals(ldapStatistics.getModifyDNResponses(),
                     modifyDNResponses+1);
      } finally
      {
        LockManager.unlock(entry.getDN(), writeLock);