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/LocalBackendAddOperation.java |   44 +++++++++-----------------------------------
 1 files changed, 9 insertions(+), 35 deletions(-)

diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
index e649b81..d873722 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendAddOperation.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2012 ForgeRock AS
+ *      Portions Copyright 2011-2013 ForgeRock AS
  */
 package org.opends.server.workflowelement.localbackend;
 
@@ -46,19 +46,8 @@
 import org.opends.messages.MessageBuilder;
 import org.opends.server.api.*;
 import org.opends.server.api.plugin.PluginResult;
-import org.opends.server.controls.LDAPAssertionRequestControl;
-import org.opends.server.controls.LDAPPostReadRequestControl;
-import org.opends.server.controls.PasswordPolicyErrorType;
-import org.opends.server.controls.PasswordPolicyResponseControl;
-import org.opends.server.controls.ProxiedAuthV1Control;
-import org.opends.server.controls.ProxiedAuthV2Control;
-import org.opends.server.core.AccessControlConfigManager;
-import org.opends.server.core.AddOperation;
-import org.opends.server.core.AddOperationWrapper;
-import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.PasswordPolicy;
-import org.opends.server.core.PersistentSearch;
-import org.opends.server.core.PluginConfigManager;
+import org.opends.server.controls.*;
+import org.opends.server.core.*;
 import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.schema.AuthPasswordSyntax;
 import org.opends.server.schema.UserPasswordSyntax;
@@ -152,6 +141,7 @@
    * @return  The entry to be added to the server, or <CODE>null</CODE> if it is
    *          not yet available.
    */
+  @Override
   public final Entry getEntryToAdd()
   {
     return entry;
@@ -234,21 +224,12 @@
         // always released when exiting this method, no matter what.  Since
         // the entry shouldn't exist yet, locking earlier than necessary
         // shouldn't cause a problem.
-        for (int i=0; i < 3; i++)
-        {
-          entryLock = LockManager.lockWrite(entryDN);
-          if (entryLock != null)
-          {
-            break;
-          }
-        }
-
+        entryLock = LockManager.lockWrite(entryDN);
         if (entryLock == null)
         {
-          setResultCode(DirectoryServer.getServerErrorResultCode());
+          setResultCode(ResultCode.BUSY);
           appendErrorMessage(ERR_ADD_CANNOT_LOCK_ENTRY.get(
                                   String.valueOf(entryDN)));
-
           break addProcessing;
         }
 
@@ -751,6 +732,7 @@
     {
       registerPostResponseCallback(new Runnable()
       {
+        @Override
         public void run()
         {
           // Notify persistent searches.
@@ -823,18 +805,10 @@
     }
     else
     {
-      for (int i=0; i < 3; i++)
-      {
-        parentLock = LockManager.lockRead(parentDN);
-        if (parentLock != null)
-        {
-          break;
-        }
-      }
-
+      parentLock = LockManager.lockRead(parentDN);
       if (parentLock == null)
       {
-        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
+        throw new DirectoryException(ResultCode.BUSY,
                                      ERR_ADD_CANNOT_LOCK_PARENT.get(
                                           String.valueOf(entryDN),
                                           String.valueOf(parentDN)));

--
Gitblit v1.10.0