From f09c069e92d051036af2a969fe5289cb7c4826ba Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 26 Oct 2015 08:22:49 +0000
Subject: [PATCH] OPENDJ-2349: fix deadlocks during subtree deletes and moddn

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java
index 7b70fb1..281ca9e 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java
@@ -30,6 +30,7 @@
 import static org.forgerock.util.Utils.*;
 import static org.opends.messages.BackendMessages.*;
 import static org.opends.server.core.DirectoryServer.*;
+import static org.opends.server.backends.pluggable.CursorTransformer.transformKeysAndValues;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -45,6 +46,7 @@
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.util.Function;
 import org.forgerock.util.Reject;
 import org.opends.server.api.CompressedSchema;
 import org.opends.server.backends.pluggable.spi.Cursor;
@@ -65,6 +67,24 @@
 {
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
+  /** Transforms cursor keys into EntryIDs. */
+  private static final Function<ByteString, EntryID, Exception> TO_ENTRY_ID =
+          new Function<ByteString, EntryID, Exception>() {
+    @Override
+    public EntryID apply(ByteString value) throws Exception {
+      return new EntryID(value);
+    }
+  };
+
+  /** Transforms cursor values into Entry objects. */
+  private final CursorTransformer.ValueTransformer<ByteString, ByteString, Entry, Exception> TO_ENTRY =
+          new CursorTransformer.ValueTransformer<ByteString, ByteString, Entry, Exception>() {
+    @Override
+    public Entry transform(ByteString key, ByteString value) throws Exception {
+      return get0(value);
+    }
+  };
+
   /** Parameters for compression and encryption. */
   private DataConfig dataConfig;
 
@@ -372,6 +392,10 @@
       throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), ERR_ENTRY_DATABASE_CORRUPT.get(entryID));
     }
   }
+
+  Cursor<EntryID, Entry> openCursor(ReadableTransaction txn)
+  {
+    return transformKeysAndValues(txn.openCursor(getName()), TO_ENTRY_ID, TO_ENTRY);
   }
 
   /**

--
Gitblit v1.10.0