From e14218f31c778d776b3311f6e2b30ff1aa6f7974 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 22 Jan 2015 11:08:33 +0000
Subject: [PATCH] OPENDJ-1753 NPE when deleting backend index on an attribute index

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java |   40 +++++++++++++++++++++-------------------
 1 files changed, 21 insertions(+), 19 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 9d42dd6..0dde90e 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
@@ -21,15 +21,15 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2014 ForgeRock AS
+ *      Copyright 2014-2015 ForgeRock AS
  */
 package org.opends.server.backends.persistit;
 
-import static com.persistit.Transaction.CommitPolicy.GROUP;
-import static com.persistit.Transaction.CommitPolicy.SOFT;
-import static java.util.Arrays.asList;
-import static org.opends.messages.JebMessages.NOTE_PERSISTIT_MEMORY_CFG;
-import static org.opends.server.util.StaticUtils.getFileForPath;
+import static com.persistit.Transaction.CommitPolicy.*;
+import static java.util.Arrays.*;
+
+import static org.opends.messages.JebMessages.*;
+import static org.opends.server.util.StaticUtils.*;
 
 import java.io.File;
 import java.util.HashMap;
@@ -255,7 +255,7 @@
     {
       try
       {
-        final Exchange ex = getExchange(treeName);
+        final Exchange ex = getExchangeFromCache(treeName);
         bytesToKey(ex.getKey(), key);
         bytesToValue(ex.getValue(), value);
         ex.store();
@@ -271,7 +271,7 @@
     {
       try
       {
-        final Exchange ex = getExchange(treeName);
+        final Exchange ex = getExchangeFromCache(treeName);
         bytesToKey(ex.getKey(), key);
         ex.remove();
       }
@@ -287,7 +287,7 @@
       Exchange ex = null;
       try
       {
-        ex = getExchange(treeName);
+        ex = getExchangeFromCache(treeName);
         ex.removeTree();
       }
       catch (final PersistitException e)
@@ -296,6 +296,7 @@
       }
       finally
       {
+        exchanges.values().remove(ex);
         db.releaseExchange(ex);
       }
     }
@@ -316,7 +317,7 @@
          * exchange in order to avoid reentrant accesses to the same tree
          * interfering with the cursor position.
          */
-        return new CursorImpl(getExchange0(treeName, false));
+        return new CursorImpl(getNewExchange(treeName, false));
       }
       catch (final PersistitException e)
       {
@@ -330,7 +331,7 @@
       Exchange ex = null;
       try
       {
-        ex = getExchange0(treeName, true);
+        ex = getNewExchange(treeName, true);
       }
       catch (final PersistitException e)
       {
@@ -352,7 +353,7 @@
         // Following code is fine because Persistit provides snapshot isolation.
         // If another thread tries to update the same key, we'll get a RollbackException
         // And the write operation will be retried (see write() method in this class)
-        final Exchange ex = getExchange(treeName);
+        final Exchange ex = getExchangeFromCache(treeName);
         bytesToKey(ex.getKey(), key);
         ex.fetch();
         final Value exValue = ex.getValue();
@@ -375,7 +376,7 @@
     {
       try
       {
-        final Exchange ex = getExchange(treeName);
+        final Exchange ex = getExchangeFromCache(treeName);
         bytesToKey(ex.getKey(), key);
         ex.fetch();
         return valueToBytes(ex.getValue());
@@ -391,7 +392,7 @@
     {
       try
       {
-        final Exchange ex = getExchange(treeName);
+        final Exchange ex = getExchangeFromCache(treeName);
         bytesToKey(ex.getKey(), key);
         return ex.remove();
       }
@@ -413,7 +414,7 @@
     {
       try
       {
-        getExchange(treeName).removeAll();
+        getExchangeFromCache(treeName).removeAll();
       }
       catch (final PersistitException e)
       {
@@ -427,7 +428,7 @@
     {
       try
       {
-        final Exchange ex = getExchange(treeName);
+        final Exchange ex = getExchangeFromCache(treeName);
         bytesToKey(ex.getKey(), key);
         ex.fetch();
         final ByteSequence oldValue = valueToBytes(ex.getValue());
@@ -441,13 +442,13 @@
       }
     }
 
-    private Exchange getExchange(final TreeName treeName)
+    private Exchange getExchangeFromCache(final TreeName treeName)
         throws PersistitException
     {
       Exchange exchange = exchanges.get(treeName);
       if (exchange == null)
       {
-        exchange = getExchange0(treeName, false);
+        exchange = getNewExchange(treeName, false);
         exchanges.put(treeName, exchange);
       }
       return exchange;
@@ -459,6 +460,7 @@
       {
         db.releaseExchange(ex);
       }
+      exchanges.clear();
     }
   }
 
@@ -677,7 +679,7 @@
     return value;
   }
 
-  private Exchange getExchange0(final TreeName treeName, final boolean create)
+  private Exchange getNewExchange(final TreeName treeName, final boolean create)
       throws PersistitException
   {
     return db.getExchange(volume, treeName.toString(), create);

--
Gitblit v1.10.0