From 43337ecac9365309ad8cd593611e619f36fab39f Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Tue, 22 Apr 2008 22:33:23 +0000
Subject: [PATCH] Fixed an issue where deadlocks could occur in the LockManager when the server is in heavy add/mod load. An add operation takes a read lock on the parent DN and a write lock on the target DN in that order. However, mod operations first takes an write lock on the target DN then inadvertantly tries takes an read lock on the parent DN through the entryExists method. This could cause a deadlock in the following case with the fair ordering reentrant read write lock:

---
 opendj-sdk/opends/src/server/org/opends/server/api/Backend.java |   30 +-----------------------------
 1 files changed, 1 insertions(+), 29 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java b/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java
index 61d6425..5f1c345 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/api/Backend.java
@@ -33,7 +33,6 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.locks.Lock;
 
 import org.opends.server.admin.Configuration;
 import org.opends.server.config.ConfigException;
@@ -56,7 +55,6 @@
 import org.opends.server.types.LDIFExportConfig;
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.LDIFImportResult;
-import org.opends.server.types.LockManager;
 import org.opends.server.types.RestoreConfig;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.WritabilityMode;
@@ -486,33 +484,7 @@
   public boolean entryExists(DN entryDN)
          throws DirectoryException
   {
-    Lock lock = null;
-    for (int i=0; i < 3; i++)
-    {
-      lock = LockManager.lockRead(entryDN);
-      if (lock != null)
-      {
-        break;
-      }
-    }
-
-    if (lock == null)
-    {
-      Message message =
-          ERR_BACKEND_CANNOT_LOCK_ENTRY.get(String.valueOf(entryDN));
-      throw new DirectoryException(
-                     DirectoryServer.getServerErrorResultCode(),
-                     message);
-    }
-
-    try
-    {
-      return (getEntry(entryDN) != null);
-    }
-    finally
-    {
-      LockManager.unlock(entryDN, lock);
-    }
+    return (getEntry(entryDN) != null);
   }
 
 

--
Gitblit v1.10.0