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