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/jeb/JEStorage.java |   23 +++++++++++++++++++++--
 1 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/JEStorage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/JEStorage.java
index 69314d0..2ad53f2 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/JEStorage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/JEStorage.java
@@ -101,6 +101,7 @@
 import com.sleepycat.je.EnvironmentConfig;
 import com.sleepycat.je.OperationStatus;
 import com.sleepycat.je.Transaction;
+import com.sleepycat.je.TransactionConfig;
 
 /** Berkeley DB Java Edition (JE for short) database implementation of the {@link Storage} engine. */
 public final class JEStorage implements Storage, Backupable, ConfigurationChangeListener<JEBackendCfg>,
@@ -171,6 +172,20 @@
     }
 
     @Override
+    public void delete() throws NoSuchElementException, UnsupportedOperationException
+    {
+      throwIfNotSuccess();
+      try
+      {
+        cursor.delete();
+      }
+      catch (DatabaseException e)
+      {
+        throw new StorageRuntimeException(e);
+      }
+    }
+
+    @Override
     public boolean positionToKey(final ByteSequence key)
     {
       clearCurrentKeyAndValue();
@@ -568,6 +583,10 @@
   }
 
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
+
+  /** Use read committed isolation instead of the default which is repeatable read. */
+  private static final TransactionConfig TXN_READ_COMMITTED = new TransactionConfig().setReadCommitted(true);
+
   private final ServerContext serverContext;
   private final File backendDirectory;
   private JEBackendCfg config;
@@ -609,7 +628,7 @@
         tree = trees.get(treeName);
         if (tree == null)
         {
-          tree = env.openDatabase(txn, toDatabaseName(treeName), dbConfig());
+          tree = env.openDatabase(null, toDatabaseName(treeName), dbConfig());
           trees.put(treeName, tree);
         }
       }
@@ -782,7 +801,7 @@
   {
     if (envConfig.getTransactional())
     {
-      final Transaction txn = env.beginTransaction(null, null);
+      final Transaction txn = env.beginTransaction(null, TXN_READ_COMMITTED);
       logger.trace("beginTransaction txnid=%d", txn.getId());
       return txn;
     }

--
Gitblit v1.10.0