From 65c4b9f6eef396deec7aa3f0c335f9ef1b9099ce Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Thu, 09 Jul 2015 16:37:07 +0000
Subject: [PATCH] OPENDJ-2171 CR-7414 import-ldif in append mode should not reset index state

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java |  104 ++++++++++++++++++++++++++++++++--------------------
 1 files changed, 64 insertions(+), 40 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
index 5d65d8b..8e7decf 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
@@ -246,7 +246,7 @@
   /** Map of container ids to database containers. */
   private final ConcurrentHashMap<Integer, Index> idContainerMap = new ConcurrentHashMap<>();
   /** Map of container ids to entry containers. */
-  private final ConcurrentHashMap<Integer, EntryContainer> idECMap = new ConcurrentHashMap<>();
+  private final ConcurrentHashMap<Integer, Suffix> idSuffixMap = new ConcurrentHashMap<>();
 
   /** Used to synchronize when a scratch file index writer is first setup. */
   private final Object synObj = new Object();
@@ -670,7 +670,6 @@
       if (suffix != null)
       {
         dnSuffixMap.put(ec.getBaseDN(), suffix);
-        generateIndexID(suffix);
       }
     }
   }
@@ -681,7 +680,7 @@
    */
   private void generateIndexID(Suffix suffix)
   {
-    for (AttributeIndex attributeIndex : suffix.getAttrIndexMap().values())
+    for (AttributeIndex attributeIndex : suffix.getAttributeIndexes())
     {
       for(Index index : attributeIndex.getAllIndexes()) {
         putInIdContainerMap(index);
@@ -904,7 +903,7 @@
       logger.info(NOTE_IMPORT_STARTING, DirectoryServer.getVersionString(), BUILD_ID, REVISION_NUMBER);
       logger.info(NOTE_IMPORT_THREAD_COUNT, threadCount);
       initializeSuffixes();
-      setIndexesTrusted(false);
+      setupIndexesForImport();
 
       final long startTime = System.currentTimeMillis();
       phaseOne();
@@ -928,7 +927,7 @@
       }
       final long phaseTwoFinishTime = System.currentTimeMillis();
 
-      setIndexesTrusted(true);
+      setIndexesTrusted();
       switchEntryContainers();
       recursiveDelete(tempDir);
       final long finishTime = System.currentTimeMillis();
@@ -1011,13 +1010,13 @@
     }
   }
 
-  private void setIndexesTrusted(boolean trusted) throws JebException
+  private void setIndexesTrusted() throws JebException
   {
     try
     {
       for (Suffix s : dnSuffixMap.values())
       {
-        s.setIndexesTrusted(trusted);
+        s.setIndexesTrusted();
       }
     }
     catch (DatabaseException ex)
@@ -1026,6 +1025,15 @@
     }
   }
 
+  private void setupIndexesForImport()
+  {
+    for (Suffix s : dnSuffixMap.values())
+    {
+      s.setIndexesNotTrusted(importConfiguration.appendToExistingData());
+      generateIndexID(s);
+    }
+  }
+
   private void phaseOne() throws InterruptedException, ExecutionException
   {
     initializeIndexBuffers();
@@ -1459,10 +1467,9 @@
     void processAllIndexes(Suffix suffix, Entry entry, EntryID entryID)
         throws DatabaseException, DirectoryException, JebException, InterruptedException
     {
-      for (Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+      for (AttributeIndex attrIndex : suffix.getAttributeIndexes())
       {
-        AttributeType attributeType = mapEntry.getKey();
-        fillIndexKey(suffix, mapEntry.getValue(), entry, attributeType, entryID);
+        fillIndexKey(suffix, attrIndex, entry, attrIndex.getAttributeType(), entryID);
       }
     }
 
@@ -1585,12 +1592,12 @@
     void processIndexes(Suffix suffix, Entry entry, EntryID entryID)
         throws DatabaseException, DirectoryException, JebException, InterruptedException
     {
-      for (Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+      for (AttributeIndex attrIndex : suffix.getAttributeIndexes())
       {
-        AttributeType attributeType = mapEntry.getKey();
+        AttributeType attributeType = attrIndex.getAttributeType();
         if (entry.hasAttribute(attributeType))
         {
-          fillIndexKey(suffix, mapEntry.getValue(), entry, attributeType, entryID);
+          fillIndexKey(suffix, attrIndex, entry, attributeType, entryID);
         }
       }
     }
@@ -1712,7 +1719,7 @@
       DN2ID dn2id = suffix.getDN2ID();
       byte[] dnBytes = JebFormat.dnToDNKey(dn, suffix.getBaseDN().size());
       int id = processKey(dn2id, dnBytes, entryID, dnIndexKey, true);
-      idECMap.putIfAbsent(id, suffix.getEntryContainer());
+      idSuffixMap.putIfAbsent(id, suffix);
     }
 
     void processDN2URI(Suffix suffix, Entry oldEntry, Entry newEntry) throws DatabaseException
@@ -2074,7 +2081,7 @@
       DNState dnState;
       if (!dnStateMap.containsKey(indexID))
       {
-        dnState = new DNState(idECMap.get(indexID));
+        dnState = new DNState(idSuffixMap.get(indexID));
         dnStateMap.put(indexID, dnState);
       }
       else
@@ -2107,25 +2114,32 @@
       private final EntryContainer entryContainer;
       private final boolean isSubordinatesEnabled;
       // Fields below are only needed if the isSubordinatesEnabled boolean is true.
-      private final Map<byte[], ImportIDSet> id2childTree;
-      private final Map<byte[], ImportIDSet> id2subtreeTree;
-      private final int childLimit, subTreeLimit;
-      private final boolean childDoCount, subTreeDoCount;
+      private Map<byte[], ImportIDSet> id2childTree;
+      private Map<byte[], ImportIDSet> id2subtreeTree;
+      private int childLimit, subTreeLimit;
+      private boolean childDoCount, subTreeDoCount;
+      private boolean updateID2Children, updateID2Subtree;
 
-      DNState(EntryContainer entryContainer)
+      DNState(Suffix suffix)
       {
-        this.entryContainer = entryContainer;
+        this.entryContainer = suffix.getEntryContainer();
         parentIDMap = new TreeMap<>();
 
         isSubordinatesEnabled =  backendConfiguration.isSubordinateIndexesEnabled();
-        Comparator<byte[]> childComparator = entryContainer.getID2Children().getComparator();
-        id2childTree = new TreeMap<>(childComparator);
-        childLimit = entryContainer.getID2Children().getIndexEntryLimit();
-        childDoCount = isSubordinatesEnabled && entryContainer.getID2Children().getMaintainCount();
-        Comparator<byte[]> subComparator = entryContainer.getID2Subtree().getComparator();
-        subTreeLimit = entryContainer.getID2Subtree().getIndexEntryLimit();
-        subTreeDoCount = isSubordinatesEnabled && entryContainer.getID2Subtree().getMaintainCount();
-        id2subtreeTree = new TreeMap<>(subComparator);
+        if (suffix.isProcessID2Children())
+        {
+          childLimit = entryContainer.getID2Children().getIndexEntryLimit();
+          childDoCount = isSubordinatesEnabled && entryContainer.getID2Children().getMaintainCount();
+          id2childTree = new TreeMap<>(entryContainer.getID2Children().getComparator());
+          updateID2Children = true;
+        }
+        if (suffix.isProcessID2Subtree())
+        {
+          subTreeLimit = entryContainer.getID2Subtree().getIndexEntryLimit();
+          subTreeDoCount = isSubordinatesEnabled && entryContainer.getID2Subtree().getMaintainCount();
+          id2subtreeTree = new TreeMap<>(entryContainer.getID2Subtree().getComparator());
+          updateID2Subtree = true;
+        }
         dnKey = new DatabaseEntry();
         dnValue = new DatabaseEntry();
         lastDN = ByteBuffer.allocate(BYTE_BUFFER_CAPACITY);
@@ -2343,8 +2357,14 @@
         indexMgr.addTotDNCount(1);
         if (isSubordinatesEnabled && parentDN != null)
         {
-          id2child(entryID);
-          id2SubTree(entryID);
+          if (updateID2Children)
+          {
+            id2child(entryID);
+          }
+          if (updateID2Subtree)
+          {
+            id2SubTree(entryID);
+          }
         }
       }
 
@@ -2366,9 +2386,16 @@
 
       public void flush()
       {
-        if (isSubordinatesEnabled) {
-          flushMapToDB(id2childTree, entryContainer.getID2Children(), false);
-          flushMapToDB(id2subtreeTree, entryContainer.getID2Subtree(), false);
+        if (isSubordinatesEnabled)
+        {
+          if (updateID2Children)
+          {
+            flushMapToDB(id2childTree, entryContainer.getID2Children(), false);
+          }
+          if (updateID2Subtree)
+          {
+            flushMapToDB(id2subtreeTree, entryContainer.getID2Subtree(), false);
+          }
         }
       }
     }
@@ -3105,10 +3132,9 @@
     {
       // rebuildList contains the user-selected index(in USER_DEFINED mode).
       final List<String> rebuildList = rebuildConfig.getRebuildList();
-      for (final Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+      for (AttributeIndex attributeIndex : entryContainer.getAttributeIndexes())
       {
-        final AttributeType attributeType = mapEntry.getKey();
-        final AttributeIndex attributeIndex = mapEntry.getValue();
+        final AttributeType attributeType = attributeIndex.getAttributeType();
         if (rebuildConfig.getRebuildMode() == RebuildMode.ALL
             || rebuildConfig.getRebuildMode() == RebuildMode.DEGRADED)
         {
@@ -3204,9 +3230,7 @@
       {
         if (reBuildDN2ID)
         {
-          EntryContainer ec = suffix.getEntryContainer();
-          ec.getID2Children().setTrusted(null, trusted);
-          ec.getID2Subtree().setTrusted(null, trusted);
+          suffix.forceTrustedDN2IDRelated(trusted);
         }
         setTrusted(indexMap.values(), trusted);
         if (!vlvIndexes.isEmpty())

--
Gitblit v1.10.0