From 4942a89087d560696123c5de7d87ee99c2210c9d Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Tue, 22 Sep 2009 20:56:23 +0000
Subject: [PATCH] Fix for issue 4117: Reordered the access to dn2id such that all moved DNs are removed sequentially then added back. Also fixed a case where an error caused by a corrupted index does not result in the index being put into the untrusted state.

---
 opends/src/server/org/opends/server/backends/jeb/Index.java |   71 +++++++++++++++++------------------
 1 files changed, 34 insertions(+), 37 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/Index.java b/opends/src/server/org/opends/server/backends/jeb/Index.java
index 8d52279..17d196c 100644
--- a/opends/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opends/src/server/org/opends/server/backends/jeb/Index.java
@@ -499,21 +499,6 @@
     OperationStatus status;
     DatabaseEntry data = new DatabaseEntry();
 
-    // Handle cases where nothing is changed early to avoid
-    // DB access.
-    if(deletedIDs != null && deletedIDs.size() == 0 &&
-        (addedIDs == null || addedIDs.size() == 0))
-    {
-      return;
-    }
-
-    if(addedIDs != null && addedIDs.size() == 0 &&
-        (deletedIDs == null || deletedIDs.size() == 0))
-    {
-      return;
-    }
-
-
     if(deletedIDs == null && addedIDs == null)
     {
       status = delete(txn, key);
@@ -532,6 +517,14 @@
       return;
     }
 
+    // Handle cases where nothing is changed early to avoid
+    // DB access.
+    if((deletedIDs == null || deletedIDs.size() == 0) &&
+        (addedIDs == null || addedIDs.size() == 0))
+    {
+      return;
+    }
+
     if(maintainCount)
     {
       for(int i = 0; i < phantomWriteRetires; i++)
@@ -565,18 +558,22 @@
       }
       else
       {
-        if(rebuildRunning || trusted)
+        if(deletedIDs != null && !rebuildRunning && trusted)
         {
-          if(deletedIDs != null)
+          if(debugEnabled())
           {
-            if(debugEnabled())
-            {
-              StringBuilder builder = new StringBuilder();
-              StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
-              TRACER.debugError("The expected key does not exist in the " +
-                  "index %s.\nKey:%s", name, builder.toString());
-            }
+            StringBuilder builder = new StringBuilder();
+            StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
+            TRACER.debugError("The expected key does not exist in the " +
+                "index %s.\nKey:%s", name, builder.toString());
           }
+
+          setTrusted(txn, false);
+        }
+
+        if((rebuildRunning || trusted) && addedIDs != null &&
+            addedIDs.size() > 0)
+        {
           data.setData(addedIDs.toDatabase());
 
           status = insert(txn, key, data);
@@ -682,25 +679,25 @@
     }
     else
     {
-      if(rebuildRunning || trusted)
+      if(deletedIDs != null && !rebuildRunning && trusted)
       {
-        if(deletedIDs != null)
+        if(debugEnabled())
         {
-          if(debugEnabled())
-          {
-            StringBuilder builder = new StringBuilder();
-            StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
-            TRACER.debugError("The expected key does not exist in the " +
-                "index %s.\nKey:%s", name, builder.toString());
-          }
+          StringBuilder builder = new StringBuilder();
+          StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
+          TRACER.debugError("The expected key does not exist in the " +
+              "index %s.\nKey:%s", name, builder.toString());
         }
+
+        setTrusted(txn, false);
+      }
+
+      if((rebuildRunning || trusted) && addedIDs != null && addedIDs.size() > 0)
+      {
         data.setData(addedIDs.toDatabase());
         return insert(txn, key, data);
       }
-      else
-      {
-        return OperationStatus.SUCCESS;
-      }
+      return OperationStatus.SUCCESS;
     }
   }
 

--
Gitblit v1.10.0