From 97cafe6c9cfa077690c61c22ee3fdc8d4501d150 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 SubentryManager for modify/delete requests
---
opendj-server-legacy/src/main/java/org/opends/server/api/DITCacheMap.java | 6 ++++++
opendj-server-legacy/src/main/java/org/opends/server/core/SubentryManager.java | 21 +++++++++++++++++++++
2 files changed, 27 insertions(+), 0 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 5fe5ec7..73a7b57 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
@@ -737,6 +737,12 @@
}
@Override
+ public boolean isEmpty()
+ {
+ return !(new SubtreeSetIterator(this.key).hasNext());
+ }
+
+ @Override
public int size()
{
int size = 0;
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryManager.java b/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryManager.java
index 630e4a9..3d5e7bd 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryManager.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/SubentryManager.java
@@ -607,6 +607,22 @@
private void doPostDelete(Entry entry)
{
+ // Fast-path for deleted entries which do not have subordinate sub-entries.
+ lock.readLock().lock();
+ try
+ {
+ final Collection<SubEntry> subtree = dit2SubEntry.getSubtree(entry.getName());
+ if (subtree.isEmpty())
+ {
+ return;
+ }
+ }
+ finally
+ {
+ lock.readLock().unlock();
+ }
+
+ // Slow-path.
lock.writeLock().lock();
try
{
@@ -626,6 +642,11 @@
{
final boolean oldEntryIsSubentry = isSubEntry(oldEntry);
final boolean newEntryIsSubentry = isSubEntry(newEntry);
+ if (!oldEntryIsSubentry && !newEntryIsSubentry)
+ {
+ return; // Nothing to do.
+ }
+
boolean notify = false;
lock.writeLock().lock();
try
--
Gitblit v1.10.0