From af76a3750288d90c006022829887c92601a4737c Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 24 Jun 2013 11:56:44 +0000
Subject: [PATCH] OPENDJ-885 - Replication replay may lose changes if it can't acquire a writeLock

---
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java |   30 +++++++-----------------------
 1 files changed, 7 insertions(+), 23 deletions(-)

diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java
index de3d6f4..380ee88 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendDeleteOperation.java
@@ -23,12 +23,10 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2012 ForgeRock AS
+ *      Portions Copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.workflowelement.localbackend;
 
-
-
 import java.util.List;
 import java.util.concurrent.locks.Lock;
 
@@ -39,18 +37,13 @@
 import org.opends.server.api.SynchronizationProvider;
 import org.opends.server.api.plugin.PluginResult;
 import org.opends.server.controls.*;
-import org.opends.server.core.AccessControlConfigManager;
-import org.opends.server.core.DeleteOperationWrapper;
-import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.PersistentSearch;
-import org.opends.server.core.PluginConfigManager;
+import org.opends.server.core.*;
 import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.types.*;
 import org.opends.server.types.operation.PostOperationDeleteOperation;
 import org.opends.server.types.operation.PostResponseDeleteOperation;
-import org.opends.server.types.operation.PreOperationDeleteOperation;
 import org.opends.server.types.operation.PostSynchronizationDeleteOperation;
+import org.opends.server.types.operation.PreOperationDeleteOperation;
 
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.loggers.ErrorLogger.*;
@@ -58,8 +51,6 @@
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
-
-
 /**
  * This class defines an operation used to delete an entry in a local backend
  * of the Directory Server.
@@ -127,6 +118,7 @@
    * @return  The entry to be deleted, or <CODE>null</CODE> if the entry is not
    *          yet available.
    */
+  @Override
   public Entry getEntryToDelete()
   {
     return entry;
@@ -169,19 +161,10 @@
       }
 
       // Grab a write lock on the entry.
-      Lock entryLock = null;
-      for (int i=0; i < 3; i++)
-      {
-        entryLock = LockManager.lockWrite(entryDN);
-        if (entryLock != null)
-        {
-          break;
-        }
-      }
-
+      final Lock entryLock = LockManager.lockWrite(entryDN);
       if (entryLock == null)
       {
-        setResultCode(DirectoryServer.getServerErrorResultCode());
+        setResultCode(ResultCode.BUSY);
         appendErrorMessage(ERR_DELETE_CANNOT_LOCK_ENTRY.get(
                                 String.valueOf(entryDN)));
         break deleteProcessing;
@@ -455,6 +438,7 @@
       registerPostResponseCallback(new Runnable()
       {
 
+        @Override
         public void run()
         {
           // Notify persistent searches.

--
Gitblit v1.10.0