From 17e216ed32e21eddece22d782f8a256711ab3ad8 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 04 Dec 2014 15:08:07 +0000
Subject: [PATCH] OPENDJ-1602 (CR-5566) New pluggable storage based backend

---
 opendj3-server-dev/src/server/org/opends/server/backends/jeb/VLVIndex.java       |   82 -----
 opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java |  124 --------
 opendj3-server-dev/src/server/org/opends/server/backends/jeb/Index.java          |  312 ----------------------
 opendj3-server-dev/src/server/org/opends/server/backends/jeb/EntryContainer.java |  175 ++----------
 opendj3-server-dev/src/server/org/opends/server/backends/jeb/NullIndex.java      |  140 ----------
 5 files changed, 40 insertions(+), 793 deletions(-)

diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
index be3c7aa..2e8f6ff 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
@@ -55,7 +55,6 @@
 import com.sleepycat.je.DatabaseEntry;
 import com.sleepycat.je.DatabaseException;
 import com.sleepycat.je.Environment;
-import com.sleepycat.je.Transaction;
 
 import static org.opends.messages.JebMessages.*;
 import static org.opends.server.util.ServerConstants.*;
@@ -115,29 +114,22 @@
    * class in the SDK could implement the logic, I hope).
    */
 
-  /**
-   * A database key for the presence index.
-   */
-  public static final DatabaseEntry presenceKey =
-       new DatabaseEntry("+".getBytes());
+  /** A database key for the presence index. */
+  static final DatabaseEntry presenceKey = new DatabaseEntry("+".getBytes());
 
-  /**
-   * The entryContainer in which this attribute index resides.
-   */
-  private EntryContainer entryContainer;
-  private Environment env;
-  private State state;
+  /** The entryContainer in which this attribute index resides. */
+  private final EntryContainer entryContainer;
+  private final Environment env;
+  private final State state;
 
-  /**
-   * The attribute index configuration.
-   */
+  /** The attribute index configuration. */
   private LocalDBIndexCfg indexConfig;
 
   /** The mapping from names to indexes. */
   private final Map<String, Index> nameToIndexes;
   private final IndexQueryFactory<IndexQuery> indexQueryFactory;
 
-  private int cursorEntryLimit = 100000;
+  private final int cursorEntryLimit = 100000;
 
   /**
    * The mapping from extensible index types (e.g. "substring" or "shared") to list of indexes.
@@ -362,33 +354,6 @@
   }
 
   /**
-   * Update the attribute index for a new entry.
-   *
-   * @param txn         The database transaction to be used for the insertions.
-   * @param entryID     The entry ID.
-   * @param entry       The contents of the new entry.
-   * @return True if all the index keys for the entry are added. False if the
-   *         entry ID already exists for some keys.
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   */
-  public boolean addEntry(Transaction txn, EntryID entryID, Entry entry)
-       throws DatabaseException, DirectoryException
-  {
-    boolean success = true;
-
-    final IndexingOptions options = indexQueryFactory.getIndexingOptions();
-    for (Index index : nameToIndexes.values())
-    {
-      if (!index.addEntry(txn, entryID, entry, options))
-      {
-        success = false;
-      }
-    }
-    return success;
-  }
-
-  /**
    * Update the attribute index for a deleted entry.
    *
    * @param buffer The index buffer to use to store the deleted keys
@@ -408,51 +373,6 @@
   }
 
   /**
-   * Update the attribute index for a deleted entry.
-   *
-   * @param txn         The database transaction to be used for the deletions
-   * @param entryID     The entry ID
-   * @param entry       The contents of the deleted entry.
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   */
-  public void removeEntry(Transaction txn, EntryID entryID, Entry entry)
-       throws DatabaseException, DirectoryException
-  {
-    final IndexingOptions options = indexQueryFactory.getIndexingOptions();
-    for (Index index : nameToIndexes.values())
-    {
-      index.removeEntry(txn, entryID, entry, options);
-    }
-  }
-
-  /**
-   * Update the index to reflect a sequence of modifications in a Modify
-   * operation.
-   *
-   * @param txn The JE transaction to use for database updates.
-   * @param entryID The ID of the entry that was modified.
-   * @param oldEntry The entry before the modifications were applied.
-   * @param newEntry The entry after the modifications were applied.
-   * @param mods The sequence of modifications in the Modify operation.
-   * @throws DatabaseException If an error occurs during an operation on a
-   * JE database.
-   */
-  public void modifyEntry(Transaction txn,
-                          EntryID entryID,
-                          Entry oldEntry,
-                          Entry newEntry,
-                          List<Modification> mods)
-       throws DatabaseException
-  {
-    final IndexingOptions options = indexQueryFactory.getIndexingOptions();
-    for (Index index : nameToIndexes.values())
-    {
-      index.modifyEntry(txn, entryID, oldEntry, newEntry, mods, options);
-    }
-  }
-
-  /**
    * Update the index to reflect a sequence of modifications in a Modify
    * operation.
    *
@@ -704,18 +624,6 @@
   }
 
   /**
-   * Close cursors related to the attribute indexes.
-   *
-   * @throws DatabaseException If a database error occurs.
-   */
-  public void closeCursors() throws DatabaseException {
-    for (Index index : nameToIndexes.values())
-    {
-      index.closeCursor();
-    }
-  }
-
-  /**
    * Return the number of values that have exceeded the entry limit since this
    * object was created.
    *
@@ -1025,22 +933,6 @@
   }
 
   /**
-   * Set the index truststate.
-   * @param txn A database transaction, or null if none is required.
-   * @param trusted True if this index should be trusted or false
-   *                otherwise.
-   * @throws DatabaseException If an error occurs in the JE database.
-   */
-  public synchronized void setTrusted(Transaction txn, boolean trusted)
-      throws DatabaseException
-  {
-    for (Index index : nameToIndexes.values())
-    {
-      index.setTrusted(txn, trusted);
-    }
-  }
-
-  /**
    * Return true iff this index is trusted.
    * @return the trusted state of this index
    */
diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EntryContainer.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EntryContainer.java
index 59bbe33..1997c79 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -1512,7 +1512,8 @@
       }
 
       // Insert into the indexes, in index configuration order.
-      indexInsertEntry(txn, entry, entryID);
+      final IndexBuffer indexBuffer = new IndexBuffer(this);
+      indexInsertEntry(indexBuffer, entry, entryID);
 
       // Insert into id2children and id2subtree.
       // The database transaction locks on these records will be hotly
@@ -1520,11 +1521,9 @@
       // shortest duration.
       if (parentDN != null)
       {
-        // Insert into id2children for parent ID.
-        id2children.insertID(txn, parentID.getDatabaseEntry(), entryID);
-
-        // Insert into id2subtree for parent ID.
-        id2subtree.insertID(txn, parentID.getDatabaseEntry(), entryID);
+        final ByteString parentIDKeyBytes = toByteString(parentID);
+        id2children.insertID(indexBuffer, parentIDKeyBytes, entryID);
+        id2subtree.insertID(indexBuffer, parentIDKeyBytes, entryID);
 
         // Iterate up through the superior entries, starting above the parent.
         for (DN dn = getParentWithinBase(parentDN); dn != null;
@@ -1538,9 +1537,10 @@
           }
 
           // Insert into id2subtree for this node.
-          id2subtree.insertID(txn, nodeID.getDatabaseEntry(), entryID);
+          id2subtree.insertID(indexBuffer, toByteString(nodeID), entryID);
         }
       }
+      indexBuffer.flush(txn);
 
       if(addOperation != null)
       {
@@ -1588,6 +1588,11 @@
     }
   }
 
+  private ByteString toByteString(EntryID entryID)
+  {
+    return ByteString.wrap(entryID.getDatabaseEntry().getData());
+  }
+
   /**
    * Removes the specified entry from this database.  This method must ensure
    * that the entry exists and that it does not have any subordinate entries
@@ -1608,7 +1613,7 @@
   throws DirectoryException, DatabaseException, CanceledOperationException
   {
     Transaction txn = beginTransaction();
-    IndexBuffer indexBuffer = null;
+    final IndexBuffer indexBuffer = new IndexBuffer(this);
 
     try
     {
@@ -1674,13 +1679,6 @@
                 ERR_JEB_DELETE_NOT_ALLOWED_ON_NONLEAF.get(entryDN));
           }
 
-          // This is a subtree delete so create a index buffer
-          // if it there isn't one.
-          if(indexBuffer == null)
-          {
-            indexBuffer = new IndexBuffer(EntryContainer.this);
-          }
-
           /*
            * Delete this entry which by now must be a leaf because
            * we have been deleting from the bottom of the tree upwards.
@@ -1732,11 +1730,7 @@
           isSubtreeDelete || isManageDsaITOperation(deleteOperation),
           entryDN, null, null);
 
-
-      if(indexBuffer != null)
-      {
-        indexBuffer.flush(txn);
-      }
+      indexBuffer.flush(txn);
 
 
       if(deleteOperation != null)
@@ -1844,28 +1838,12 @@
     }
 
     // Remove from the indexes, in index config order.
-    if(indexBuffer != null)
-    {
-      indexRemoveEntry(indexBuffer, entry, leafID);
-    }
-    else
-    {
-      indexRemoveEntry(txn, entry, leafID);
-    }
+    indexRemoveEntry(indexBuffer, entry, leafID);
 
     // Remove the id2c and id2s records for this entry.
-    if(indexBuffer != null)
-    {
-      ByteString leafIDKeyBytes = ByteString.valueOf(leafID.longValue());
-      id2children.delete(indexBuffer, leafIDKeyBytes);
-      id2subtree.delete(indexBuffer, leafIDKeyBytes);
-    }
-    else
-    {
-      DatabaseEntry leafIDKey = leafID.getDatabaseEntry();
-      id2children.delete(txn, leafIDKey);
-      id2subtree.delete(txn, leafIDKey);
-    }
+    final ByteString leafIDKeyBytes = ByteString.valueOf(leafID.longValue());
+    id2children.delete(indexBuffer, leafIDKeyBytes);
+    id2subtree.delete(indexBuffer, leafIDKeyBytes);
 
     // Iterate up through the superior entries from the target entry.
     boolean isParent = true;
@@ -1879,28 +1857,14 @@
         throw new JebException(ERR_JEB_MISSING_DN2ID_RECORD.get(parentDN));
       }
 
-      if(indexBuffer != null)
+      ByteString parentIDBytes = ByteString.valueOf(parentID.longValue());
+      // Remove from id2children.
+      if (isParent)
       {
-        ByteString parentIDBytes = ByteString.valueOf(parentID.longValue());
-        // Remove from id2children.
-        if (isParent)
-        {
-          id2children.removeID(indexBuffer, parentIDBytes, leafID);
-          isParent = false;
-        }
-        id2subtree.removeID(indexBuffer, parentIDBytes, leafID);
+        id2children.removeID(indexBuffer, parentIDBytes, leafID);
+        isParent = false;
       }
-      else
-      {
-        DatabaseEntry nodeIDData = parentID.getDatabaseEntry();
-        // Remove from id2children.
-        if(isParent)
-        {
-          id2children.removeID(txn, nodeIDData, leafID);
-          isParent = false;
-        }
-        id2subtree.removeID(txn, nodeIDData, leafID);
-      }
+      id2subtree.removeID(indexBuffer, parentIDBytes, leafID);
     }
 
     // Remove the entry from the entry cache.
@@ -2060,19 +2024,22 @@
       id2entry.put(txn, entryID, newEntry);
 
       // Update the indexes.
+      final IndexBuffer indexBuffer = new IndexBuffer(this);
       if (modifyOperation != null)
       {
         // In this case we know from the operation what the modifications were.
         List<Modification> mods = modifyOperation.getModifications();
-        indexModifications(txn, oldEntry, newEntry, entryID, mods);
+        indexModifications(indexBuffer, oldEntry, newEntry, entryID, mods);
       }
       else
       {
         // The most optimal would be to figure out what the modifications were.
-        indexRemoveEntry(txn, oldEntry, entryID);
-        indexInsertEntry(txn, newEntry, entryID);
+        indexRemoveEntry(indexBuffer, oldEntry, entryID);
+        indexInsertEntry(indexBuffer, newEntry, entryID);
       }
 
+      indexBuffer.flush(txn);
+
       if(modifyOperation != null)
       {
         // One last check before committing
@@ -2655,30 +2622,6 @@
   /**
    * Insert a new entry into the attribute indexes.
    *
-   * @param txn The database transaction to be used for the updates.
-   * @param entry The entry to be inserted into the indexes.
-   * @param entryID The ID of the entry to be inserted into the indexes.
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   * @throws JebException If an error occurs in the JE backend.
-   */
-  private void indexInsertEntry(Transaction txn, Entry entry, EntryID entryID)
-  throws DatabaseException, DirectoryException, JebException
-  {
-    for (AttributeIndex index : attrIndexMap.values())
-    {
-      index.addEntry(txn, entryID, entry);
-    }
-
-    for (VLVIndex vlvIndex : vlvIndexMap.values())
-    {
-      vlvIndex.addEntry(txn, entryID, entry);
-    }
-  }
-
-  /**
-   * Insert a new entry into the attribute indexes.
-   *
    * @param buffer The index buffer used to buffer up the index changes.
    * @param entry The entry to be inserted into the indexes.
    * @param entryID The ID of the entry to be inserted into the indexes.
@@ -2702,30 +2645,6 @@
   /**
    * Remove an entry from the attribute indexes.
    *
-   * @param txn The database transaction to be used for the updates.
-   * @param entry The entry to be removed from the indexes.
-   * @param entryID The ID of the entry to be removed from the indexes.
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   * @throws JebException If an error occurs in the JE backend.
-   */
-  private void indexRemoveEntry(Transaction txn, Entry entry, EntryID entryID)
-  throws DatabaseException, DirectoryException, JebException
-  {
-    for (AttributeIndex index : attrIndexMap.values())
-    {
-      index.removeEntry(txn, entryID, entry);
-    }
-
-    for (VLVIndex vlvIndex : vlvIndexMap.values())
-    {
-      vlvIndex.removeEntry(txn, entryID, entry);
-    }
-  }
-
-  /**
-   * Remove an entry from the attribute indexes.
-   *
    * @param buffer The index buffer used to buffer up the index changes.
    * @param entry The entry to be removed from the indexes.
    * @param entryID The ID of the entry to be removed from the indexes.
@@ -2750,40 +2669,6 @@
    * Update the attribute indexes to reflect the changes to the
    * attributes of an entry resulting from a sequence of modifications.
    *
-   * @param txn The database transaction to be used for the updates.
-   * @param oldEntry The contents of the entry before the change.
-   * @param newEntry The contents of the entry after the change.
-   * @param entryID The ID of the entry that was changed.
-   * @param mods The sequence of modifications made to the entry.
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   * @throws JebException If an error occurs in the JE backend.
-   */
-  private void indexModifications(Transaction txn, Entry oldEntry,
-      Entry newEntry,
-      EntryID entryID, List<Modification> mods)
-  throws DatabaseException, DirectoryException, JebException
-  {
-    // Process in index configuration order.
-    for (AttributeIndex index : attrIndexMap.values())
-    {
-      // Check whether any modifications apply to this indexed attribute.
-      if (isAttributeModified(index, mods))
-      {
-        index.modifyEntry(txn, entryID, oldEntry, newEntry, mods);
-      }
-    }
-
-    for(VLVIndex vlvIndex : vlvIndexMap.values())
-    {
-      vlvIndex.modifyEntry(txn, entryID, oldEntry, newEntry, mods);
-    }
-  }
-
-  /**
-   * Update the attribute indexes to reflect the changes to the
-   * attributes of an entry resulting from a sequence of modifications.
-   *
    * @param buffer The index buffer used to buffer up the index changes.
    * @param oldEntry The contents of the entry before the change.
    * @param newEntry The contents of the entry after the change.
diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/Index.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/Index.java
index aadeb8a..fa4836a 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/Index.java
@@ -198,73 +198,6 @@
     return true;
   }
 
-  /**
-   * Insert an entry ID into the set of IDs indexed by a given key.
-   *
-   * @param txn A database transaction, or null if none is required.
-   * @param key         The index key.
-   * @param entryID     The entry ID.
-   * @return True if the entry ID is inserted or ignored because the entry limit
-   *         count is exceeded. False if it already exists in the entry ID set
-   *         for the given key.
-   * @throws DatabaseException If an error occurs in the JE database.
-   */
-  public boolean insertID(Transaction txn, DatabaseEntry key, EntryID entryID)
-       throws DatabaseException
-  {
-    DatabaseEntry entryIDData = entryID.getDatabaseEntry();
-    DatabaseEntry data = new DatabaseEntry();
-
-    if(maintainCount)
-    {
-      for (int i = 0; i < phantomWriteRetries; i++)
-      {
-        if (insertIDWithRMW(txn, key, data, entryIDData, entryID) == SUCCESS)
-        {
-          return true;
-        }
-      }
-    }
-    else
-    {
-      final OperationStatus status = read(txn, key, data, LockMode.READ_COMMITTED);
-      if(status == OperationStatus.SUCCESS)
-      {
-        EntryIDSet entryIDList = new EntryIDSet(key.getData(), data.getData());
-        if (entryIDList.isDefined())
-        {
-          for (int i = 0; i < phantomWriteRetries; i++)
-          {
-            if (insertIDWithRMW(txn, key, data, entryIDData, entryID) == SUCCESS)
-            {
-              return true;
-            }
-          }
-        }
-      }
-      else if(rebuildRunning || trusted)
-      {
-        if (insert(txn, key, entryIDData) == OperationStatus.KEYEXIST)
-        {
-          for (int i = 1; i < phantomWriteRetries; i++)
-          {
-            if (insertIDWithRMW(txn, key, data, entryIDData, entryID) == SUCCESS)
-            {
-              return true;
-            }
-          }
-        }
-      }
-      else
-      {
-        return true;
-      }
-    }
-    return false;
-  }
-
-
-
   private void deleteKey(DatabaseEntry key, ImportIDSet importIdSet, DatabaseEntry data) throws DatabaseException {
     final OperationStatus status = read(null, key, data, LockMode.DEFAULT);
     if(status == SUCCESS) {
@@ -370,56 +303,6 @@
     return true;
   }
 
-  private OperationStatus insertIDWithRMW(Transaction txn, DatabaseEntry key,
-                                          DatabaseEntry data,
-                                          DatabaseEntry entryIDData,
-                                          EntryID entryID)
-      throws DatabaseException
-  {
-    final OperationStatus status = read(txn, key, data, LockMode.RMW);
-    if(status == OperationStatus.SUCCESS)
-    {
-      EntryIDSet entryIDList =
-          new EntryIDSet(key.getData(), data.getData());
-      if (entryIDList.isDefined() && indexEntryLimit > 0 &&
-          entryIDList.size() >= indexEntryLimit)
-      {
-        if(maintainCount)
-        {
-          entryIDList = new EntryIDSet(entryIDList.size());
-        }
-        else
-        {
-          entryIDList = new EntryIDSet();
-        }
-        entryLimitExceededCount++;
-
-        if(logger.isTraceEnabled())
-        {
-          StringBuilder builder = new StringBuilder();
-          StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
-          logger.trace("Index entry exceeded in index %s. " +
-              "Limit: %d. ID list size: %d.\nKey:%s",
-              name, indexEntryLimit, entryIDList.size(), builder);
-        }
-      }
-
-      entryIDList.add(entryID);
-
-      byte[] after = entryIDList.toDatabase();
-      data.setData(after);
-      return put(txn, key, data);
-    }
-    else if(rebuildRunning || trusted)
-    {
-      return insert(txn, key, entryIDData);
-    }
-    else
-    {
-      return OperationStatus.SUCCESS;
-    }
-  }
-
   /**
    * Update the set of entry IDs for a given key.
    *
@@ -633,111 +516,13 @@
     return true;
   }
 
-  /**
-   * Remove an entry ID from the set of IDs indexed by a given key.
-   *
-   * @param txn A database transaction, or null if none is required.
-   * @param key         The index key.
-   * @param entryID     The entry ID.
-   * @throws DatabaseException If an error occurs in the JE database.
-   */
-  public void removeID(Transaction txn, DatabaseEntry key, EntryID entryID)
-      throws DatabaseException
-  {
-    DatabaseEntry data = new DatabaseEntry();
-
-    if(maintainCount)
-    {
-      removeIDWithRMW(txn, key, data, entryID);
-    }
-    else
-    {
-      final OperationStatus status = read(txn, key, data, LockMode.READ_COMMITTED);
-      if(status == SUCCESS)
-      {
-        EntryIDSet entryIDList = new EntryIDSet(key.getData(), data.getData());
-        if(entryIDList.isDefined())
-        {
-          removeIDWithRMW(txn, key, data, entryID);
-        }
-      }
-      else if (trusted && !rebuildRunning)
-      {
-        logIndexCorruptError(txn, key);
-      }
-      // Ignore failures if rebuild is running since a empty entryIDset
-      // will probably not be rebuilt.
-    }
-  }
-
-  /**
-   * Delete specified entry ID from all keys in the provided key set.
-   *
-   * @param txn  A Transaction.
-   * @param keySet A set of keys.
-   * @param entryID The entry ID to delete.
-   * @throws DatabaseException If a database error occurs.
-   */
-  public void delete(Transaction txn, Set<byte[]> keySet, EntryID entryID) throws DatabaseException {
-    setTrusted(txn, false);
-    for(byte[] key : keySet) {
-       removeIDWithRMW(txn, new DatabaseEntry(key), new DatabaseEntry(), entryID);
-    }
-    setTrusted(txn, true);
-  }
-
-  private void removeIDWithRMW(Transaction txn, DatabaseEntry key,
-                               DatabaseEntry data, EntryID entryID)
-      throws DatabaseException
-  {
-    final OperationStatus status = read(txn, key, data, LockMode.RMW);
-    if (status == SUCCESS)
-    {
-      EntryIDSet entryIDList = new EntryIDSet(key.getData(), data.getData());
-      // Ignore failures if rebuild is running since the entry ID is
-      // probably already removed.
-      if (!entryIDList.remove(entryID) && trusted && !rebuildRunning)
-      {
-        logIndexCorruptError(txn, key,
-            "The expected entry ID does not exist in the entry ID list for index %s.\nKey:%s");
-      }
-      else
-      {
-        byte[] after = entryIDList.toDatabase();
-        if (after != null)
-        {
-          data.setData(after);
-          put(txn, key, data);
-        }
-        else
-        {
-          // No more IDs, so remove the key. If index is not
-          // trusted then this will cause all subsequent reads
-          // for this key to return undefined set.
-          delete(txn, key);
-        }
-      }
-    }
-    else if (trusted && !rebuildRunning)
-    {
-      logIndexCorruptError(txn, key);
-    }
-    // Ignore failures if rebuild is running since a empty entryIDset
-    // will probably not be rebuilt.
-  }
-
   private void logIndexCorruptError(Transaction txn, DatabaseEntry key)
   {
-    logIndexCorruptError(txn, key, "The expected key does not exist in the index %s.\nKey:%s");
-  }
-
-  private void logIndexCorruptError(Transaction txn, DatabaseEntry key, String traceMsg)
-  {
     if (logger.isTraceEnabled())
     {
       StringBuilder builder = new StringBuilder();
       StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
-      logger.trace(traceMsg, name, builder);
+      logger.trace("The expected key does not exist in the index %s.\nKey:%s", name, builder);
     }
 
     setTrusted(txn, false);
@@ -1060,37 +845,6 @@
   }
 
   /**
-   * Update the index for a new entry.
-   *
-   * @param txn A database transaction, or null if none is required.
-   * @param entryID     The entry ID.
-   * @param entry       The entry to be indexed.
-   * @param options     The indexing options to use
-   * @return True if all the indexType keys for the entry are added. False if
-   *         the entry ID already exists for some keys.
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   */
-  public boolean addEntry(Transaction txn, EntryID entryID, Entry entry,
-      IndexingOptions options) throws DatabaseException, DirectoryException
-  {
-    TreeSet<ByteString> addKeys = new TreeSet<ByteString>(indexer.getBSComparator());
-    indexer.indexEntry(entry, addKeys, options);
-
-    DatabaseEntry key = new DatabaseEntry();
-    boolean success = true;
-    for (ByteString keyBytes : addKeys)
-    {
-      key.setData(keyBytes.toByteArray());
-      if(!insertID(txn, key, entryID))
-      {
-        success = false;
-      }
-    }
-    return success;
-  }
-
-  /**
    * Update the index buffer for a deleted entry.
    *
    * @param buffer The index buffer to use to store the deleted keys
@@ -1113,70 +867,6 @@
   }
 
   /**
-   * Update the index for a deleted entry.
-   *
-   * @param txn A database transaction, or null if none is required.
-   * @param entryID     The entry ID
-   * @param entry       The contents of the deleted entry.
-   * @param options     The indexing options to use
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   */
-  public void removeEntry(Transaction txn, EntryID entryID, Entry entry,
-      IndexingOptions options) throws DatabaseException, DirectoryException
-  {
-    TreeSet<ByteString> delKeys =
-        new TreeSet<ByteString>(indexer.getBSComparator());
-    indexer.indexEntry(entry, delKeys, options);
-
-    DatabaseEntry key = new DatabaseEntry();
-    for (ByteString keyBytes : delKeys)
-    {
-      key.setData(keyBytes.toByteArray());
-      removeID(txn, key, entryID);
-    }
-  }
-
-
-  /**
-   * Update the index to reflect a sequence of modifications in a Modify
-   * operation.
-   *
-   * @param txn A database transaction, or null if none is required.
-   * @param entryID The ID of the entry that was modified.
-   * @param oldEntry The entry before the modifications were applied.
-   * @param newEntry The entry after the modifications were applied.
-   * @param mods The sequence of modifications in the Modify operation.
-   * @param options The indexing options to use
-   * @throws DatabaseException If an error occurs in the JE database.
-   */
-  public void modifyEntry(Transaction txn,
-                          EntryID entryID,
-                          Entry oldEntry,
-                          Entry newEntry,
-                          List<Modification> mods, IndexingOptions options)
-       throws DatabaseException
-  {
-    TreeMap<ByteString, Boolean> modifiedKeys =
-        new TreeMap<ByteString, Boolean>(indexer.getBSComparator());
-    indexer.modifyEntry(oldEntry, newEntry, mods, modifiedKeys, options);
-
-    DatabaseEntry key = new DatabaseEntry();
-    for (Map.Entry<ByteString, Boolean> modifiedKey : modifiedKeys.entrySet())
-    {
-      key.setData(modifiedKey.getKey().toByteArray());
-      if(modifiedKey.getValue())
-      {
-        insertID(txn, key, entryID);
-      }
-      else
-      {
-        removeID(txn, key, entryID);
-      }
-    }
-  }
-
-  /**
    * Update the index to reflect a sequence of modifications in a Modify
    * operation.
    *
diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/NullIndex.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/NullIndex.java
index e61c146..2691ec2 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/NullIndex.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/NullIndex.java
@@ -67,28 +67,6 @@
     super(name, indexer, state, 0, 0, false, env, entryContainer);
   }
 
-
-
-  /** {@inheritDoc} */
-  @Override
-  public boolean insertID(IndexBuffer buffer, ByteString keyBytes,
-      EntryID entryID)
-  {
-    return true;
-  }
-
-
-
-  /** {@inheritDoc} */
-  @Override
-  public boolean insertID(Transaction txn, DatabaseEntry key, EntryID entryID)
-      throws DatabaseException
-  {
-    return true;
-  }
-
-
-
   /** {@inheritDoc} */
   @Override
   public void insert(DatabaseEntry key, ImportIDSet importIdSet,
@@ -97,8 +75,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public void delete(DatabaseEntry key, ImportIDSet importIdSet,
@@ -107,8 +83,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public boolean insert(ImportIDSet importIDSet,
@@ -118,8 +92,6 @@
     return true;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   void updateKey(Transaction txn, DatabaseEntry key, EntryIDSet deletedIDs,
@@ -128,38 +100,6 @@
     // Do nothing.
   }
 
-
-
-  /** {@inheritDoc} */
-  @Override
-  public boolean removeID(IndexBuffer buffer, ByteString keyBytes,
-      EntryID entryID)
-  {
-    return true;
-  }
-
-
-
-  /** {@inheritDoc} */
-  @Override
-  public void removeID(Transaction txn, DatabaseEntry key, EntryID entryID)
-      throws DatabaseException
-  {
-    // Do nothing.
-  }
-
-
-
-  /** {@inheritDoc} */
-  @Override
-  public void delete(Transaction txn, Set<byte[]> keySet, EntryID entryID)
-      throws DatabaseException
-  {
-    // Do nothing.
-  }
-
-
-
   /** {@inheritDoc} */
   @Override
   public void delete(IndexBuffer buffer, ByteString keyBytes)
@@ -167,8 +107,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public ConditionResult containsID(Transaction txn, DatabaseEntry key,
@@ -177,8 +115,6 @@
     return ConditionResult.UNDEFINED;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public EntryIDSet readKey(DatabaseEntry key, Transaction txn,
@@ -187,8 +123,6 @@
     return new EntryIDSet();
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public void writeKey(Transaction txn, DatabaseEntry key,
@@ -197,8 +131,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public EntryIDSet readRange(byte[] lower, byte[] upper,
@@ -207,8 +139,6 @@
     return new EntryIDSet();
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public int getEntryLimitExceededCount()
@@ -216,8 +146,6 @@
     return 0;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public void closeCursor() throws DatabaseException
@@ -225,8 +153,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public boolean addEntry(IndexBuffer buffer, EntryID entryID, Entry entry, IndexingOptions options)
@@ -235,18 +161,6 @@
     return true;
   }
 
-
-
-  /** {@inheritDoc} */
-  @Override
-  public boolean addEntry(Transaction txn, EntryID entryID, Entry entry, IndexingOptions options)
-      throws DatabaseException, DirectoryException
-  {
-    return true;
-  }
-
-
-
   /** {@inheritDoc} */
   @Override
   public void removeEntry(IndexBuffer buffer, EntryID entryID, Entry entry, IndexingOptions options)
@@ -255,28 +169,6 @@
     // Do nothing.
   }
 
-
-
-  /** {@inheritDoc} */
-  @Override
-  public void removeEntry(Transaction txn, EntryID entryID, Entry entry, IndexingOptions options)
-      throws DatabaseException, DirectoryException
-  {
-    // Do nothing.
-  }
-
-
-
-  /** {@inheritDoc} */
-  @Override
-  public void modifyEntry(Transaction txn, EntryID entryID, Entry oldEntry,
-      Entry newEntry, List<Modification> mods, IndexingOptions options) throws DatabaseException
-  {
-    // Do nothing.
-  }
-
-
-
   /** {@inheritDoc} */
   @Override
   public void modifyEntry(IndexBuffer buffer, EntryID entryID, Entry oldEntry,
@@ -285,8 +177,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public boolean setIndexEntryLimit(int indexEntryLimit)
@@ -294,8 +184,6 @@
     return false;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public int getIndexEntryLimit()
@@ -303,8 +191,6 @@
     return 0;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public void setTrusted(Transaction txn, boolean trusted)
@@ -313,8 +199,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public boolean isTrusted()
@@ -322,8 +206,6 @@
     return true;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public boolean isRebuildRunning()
@@ -331,8 +213,6 @@
     return false;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public void setRebuildStatus(boolean rebuildRunning)
@@ -340,8 +220,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public boolean getMaintainCount()
@@ -349,8 +227,6 @@
     return false;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public void open() throws DatabaseException
@@ -358,8 +234,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public void close() throws DatabaseException
@@ -367,8 +241,6 @@
     // Do nothing.
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   protected OperationStatus put(Transaction txn, DatabaseEntry key,
@@ -377,8 +249,6 @@
     return OperationStatus.SUCCESS;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   protected OperationStatus read(Transaction txn, DatabaseEntry key,
@@ -387,8 +257,6 @@
     return OperationStatus.SUCCESS;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   protected OperationStatus insert(Transaction txn, DatabaseEntry key,
@@ -397,8 +265,6 @@
     return OperationStatus.SUCCESS;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   protected OperationStatus delete(Transaction txn, DatabaseEntry key)
@@ -407,8 +273,6 @@
     return OperationStatus.SUCCESS;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public Cursor openCursor(Transaction txn, CursorConfig cursorConfig)
@@ -417,8 +281,6 @@
     throw new IllegalStateException();
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public long getRecordCount() throws DatabaseException
@@ -426,8 +288,6 @@
     return 0;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public PreloadStats preload(PreloadConfig config) throws DatabaseException
diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/VLVIndex.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/VLVIndex.java
index b8a8114..7a33220 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/VLVIndex.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/VLVIndex.java
@@ -320,26 +320,6 @@
     return false;
   }
 
-
-  /**
-   * Update the vlvIndex for a deleted entry.
-   *
-   * @param txn         The database transaction to be used for the deletions
-   * @param entryID     The entry ID
-   * @param entry       The contents of the deleted entry.
-   * @return True if the entry was successfully removed from this VLV index
-   * or False otherwise.
-   * @throws DatabaseException If an error occurs in the JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   * @throws JebException If an error occurs in the JE backend.
-   */
-  public boolean removeEntry(Transaction txn, EntryID entryID, Entry entry)
-      throws DatabaseException, DirectoryException, JebException
-  {
-    return shouldInclude(entry)
-        && removeValues(txn, entryID.longValue(), entry);
-  }
-
   /**
    * Update the vlvIndex for a deleted entry.
    *
@@ -377,66 +357,6 @@
    * Update the vlvIndex to reflect a sequence of modifications in a Modify
    * operation.
    *
-   * @param txn The JE transaction to use for database updates.
-   * @param entryID The ID of the entry that was modified.
-   * @param oldEntry The entry before the modifications were applied.
-   * @param newEntry The entry after the modifications were applied.
-   * @param mods The sequence of modifications in the Modify operation.
-   * @return True if the modification was successfully processed or False
-   * otherwise.
-   * @throws JebException If an error occurs during an operation on a
-   * JE database.
-   * @throws DatabaseException If an error occurs during an operation on a
-   * JE database.
-   * @throws DirectoryException If a Directory Server error occurs.
-   */
-  public boolean modifyEntry(Transaction txn,
-                          EntryID entryID,
-                          Entry oldEntry,
-                          Entry newEntry,
-                          List<Modification> mods)
-       throws DatabaseException, DirectoryException, JebException
-  {
-    if (shouldInclude(oldEntry))
-    {
-      if (shouldInclude(newEntry))
-      {
-        // The entry should still be indexed. See if any sorted attributes are
-        // changed.
-        if (isSortAttributeModified(mods))
-        {
-          boolean success;
-          // Sorted attributes have changed. Reindex the entry;
-          success = removeValues(txn, entryID.longValue(), oldEntry);
-          success &= insertValues(txn, entryID.longValue(), newEntry);
-          return success;
-        }
-      }
-      else
-      {
-        // The modifications caused the new entry to be unindexed. Remove from
-        // vlvIndex.
-        return removeValues(txn, entryID.longValue(), oldEntry);
-      }
-    }
-    else
-    {
-      if (shouldInclude(newEntry))
-      {
-        // The modifications caused the new entry to be indexed. Add to
-        // vlvIndex.
-        return insertValues(txn, entryID.longValue(), newEntry);
-      }
-    }
-
-    // The modifications does not affect this vlvIndex
-    return true;
-  }
-
-  /**
-   * Update the vlvIndex to reflect a sequence of modifications in a Modify
-   * operation.
-   *
    * @param buffer The database transaction to be used for the deletions
    * @param entryID The ID of the entry that was modified.
    * @param oldEntry The entry before the modifications were applied.
@@ -812,7 +732,7 @@
         break;
       }
 
-      final SortValuesSet sortValuesSet = getSortValuesSet(txn, data, data, LockMode.RMW);
+      final SortValuesSet sortValuesSet = getSortValuesSet(txn, key, data, LockMode.RMW);
       int oldSize = sortValuesSet.size();
       if(key.getData().length == 0)
       {

--
Gitblit v1.10.0