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/LocalBackendModifyOperation.java |   34 +++++++++-------------------------
 1 files changed, 9 insertions(+), 25 deletions(-)

diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
index de0c7dd..7d9607f 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
@@ -46,20 +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.LDAPPreReadRequestControl;
-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.DirectoryServer;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.ModifyOperationWrapper;
-import org.opends.server.core.PasswordPolicyState;
-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;
@@ -209,6 +197,7 @@
    * @return  The current entry, or <CODE>null</CODE> if it is not yet
    *          available.
    */
+  @Override
   public final Entry getCurrentEntry()
   {
     return currentEntry;
@@ -227,6 +216,7 @@
    *          modify request, or <CODE>null</CODE> if there were none or this
    *          information is not yet available.
    */
+  @Override
   public final List<AttributeValue> getCurrentPasswords()
   {
     return currentPasswords;
@@ -243,6 +233,7 @@
    * @return  The modified entry that is to be written to the backend, or
    *          <CODE>null</CODE> if it is not yet available.
    */
+  @Override
   public final Entry getModifiedEntry()
   {
     return modifiedEntry;
@@ -260,6 +251,7 @@
    *          request, or <CODE>null</CODE> if there were none or this
    *          information is not yet available.
    */
+  @Override
   public final List<AttributeValue> getNewPasswords()
   {
     return newPasswords;
@@ -342,19 +334,10 @@
       checkIfCanceled(false);
 
       // Acquire a write lock on the target 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_MODIFY_CANNOT_LOCK_ENTRY.get(
                                 String.valueOf(entryDN)));
         break modifyProcessing;
@@ -699,6 +682,7 @@
       registerPostResponseCallback(new Runnable()
       {
 
+        @Override
         public void run()
         {
           // Notify persistent searches.

--
Gitblit v1.10.0