From fd33962f8ed2a8d57e61624f3523adde2b25e974 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 15 Mar 2016 08:56:11 +0000
Subject: [PATCH] OPENDJ-2709 Reduce lock contention in AuthenticatedUsers for modify/delete requests

---
 opendj-server-legacy/src/main/java/org/opends/server/api/DITCacheMap.java         |   12 ++++++++++++
 opendj-server-legacy/src/main/java/org/opends/server/core/AuthenticatedUsers.java |   27 +++++++++++++++++++++------
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/api/DITCacheMap.java b/opendj-server-legacy/src/main/java/org/opends/server/api/DITCacheMap.java
index 73a7b57..ed646bb 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/api/DITCacheMap.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/api/DITCacheMap.java
@@ -347,6 +347,18 @@
 
 
   /**
+   * Returns {@code true} if there are stored objects subordinate to subtree DN.
+   * @param key subtree DN.
+   * @return {@code true} if there are stored objects subordinate to subtree DN.
+   */
+  public boolean containsSubtree(DN key)
+  {
+    return ditCacheMap.containsKey(key);
+  }
+
+
+
+  /**
    * Removes a set of stored objects subordinate to subtree DN.
    * @param key subtree DN.
    * @param values collection for removed objects subordinate
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/AuthenticatedUsers.java b/opendj-server-legacy/src/main/java/org/opends/server/core/AuthenticatedUsers.java
index 18b85a4..33461b6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/AuthenticatedUsers.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/AuthenticatedUsers.java
@@ -172,11 +172,12 @@
   @Override
   public PostResponse doPostResponse(PostResponseDeleteOperation op)
   {
-    if (op.getResultCode() != ResultCode.SUCCESS) {
+    final DN entryDN = op.getEntryDN();
+    if (op.getResultCode() != ResultCode.SUCCESS || operationDoesNotTargetAuthenticatedUser(entryDN))
+    {
       return PostResponse.continueOperationProcessing();
     }
 
-    final DN entryDN = op.getEntryDN();
     // Identify any client connections that may be authenticated
     // or authorized as the user whose entry has been deleted and terminate them
     Set<CopyOnWriteArraySet<ClientConnection>> arraySet = new HashSet<>();
@@ -201,12 +202,25 @@
     return PostResponse.continueOperationProcessing();
   }
 
+  private boolean operationDoesNotTargetAuthenticatedUser(final DN entryDN)
+  {
+    lock.readLock().lock();
+    try
+    {
+      return !userMap.containsSubtree(entryDN);
+    }
+    finally
+    {
+      lock.readLock().unlock();
+    }
+  }
+
   @Override
   public PostResponse doPostResponse(PostResponseModifyOperation op)
   {
     final Entry oldEntry = op.getCurrentEntry();
-
-    if (op.getResultCode() != ResultCode.SUCCESS || oldEntry == null)
+    if (op.getResultCode() != ResultCode.SUCCESS || oldEntry == null
+            ||  operationDoesNotTargetAuthenticatedUser(oldEntry.getName()))
     {
       return PostResponse.continueOperationProcessing();
     }
@@ -244,8 +258,9 @@
   {
     final Entry oldEntry = op.getOriginalEntry();
     final Entry newEntry = op.getUpdatedEntry();
-
-    if (op.getResultCode() != ResultCode.SUCCESS || oldEntry == null || newEntry == null) {
+    if (op.getResultCode() != ResultCode.SUCCESS || oldEntry == null || newEntry == null
+            || operationDoesNotTargetAuthenticatedUser(oldEntry.getName()))
+    {
       return PostResponse.continueOperationProcessing();
     }
 

--
Gitblit v1.10.0