From adedc477db26cbdc9b5874fb5ec3805dafdd3ac3 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 22 Dec 2014 23:42:56 +0000
Subject: [PATCH] OPENDJ-1710: NPE performing deletes and potentially other indexed updates against Persistit backend

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
index b06bd13..42a4092 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
@@ -238,7 +238,12 @@
         @Override
         public Cursor openCursor(TreeName treeName) {
             try {
-                return new CursorImpl(getExchange(treeName));
+              /*
+               * Acquire a new exchange for the cursor rather than using a cached
+               * exchange in order to avoid reentrant accesses to the same tree
+               * interfering with the cursor position.
+               */
+                return new CursorImpl(getExchange0(treeName, false));
             } catch (PersistitException e) {
                 throw new StorageRuntimeException(e);
             }
@@ -371,8 +376,11 @@
 
         @Override
         public void close() {
-            // Exchange is released by StorageImpl.release()
-            // once the Read/Write Operation is closed
+            /*
+             * Release immediately because this exchange did not come from the txn
+             * cache.
+             */
+            db.releaseExchange(ex);
         }
     }
 

--
Gitblit v1.10.0