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