From 7cbb790dc5d29ce209eefabbfd75e77e3fcd3d61 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 18 Dec 2014 10:40:01 +0000
Subject: [PATCH] OPENDJ-1602 New pluggable storage based backend

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java    |   28 +-----
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/RootContainer.java       |   21 ----
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java            |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java      |    5 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java      |   38 +++++----
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/DbPreloadComparator.java |    3 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java        |   81 +++-----------------
 7 files changed, 49 insertions(+), 133 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 c8e8195..fa12c03 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
@@ -23,24 +23,19 @@
  *
  *      Copyright 2014 ForgeRock AS
  */
-
 package org.opends.server.backends.persistit;
 
-
-
-import static org.opends.server.util.StaticUtils.getFileForPath;
+import static org.opends.server.util.StaticUtils.*;
 
 import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
-import org.opends.server.admin.std.server.LocalDBBackendCfg;
 import org.opends.server.admin.std.server.PersistitBackendCfg;
 import org.opends.server.backends.pluggable.spi.Cursor;
 import org.opends.server.backends.pluggable.spi.Importer;
@@ -75,7 +70,6 @@
         @Override
         public void createTree(TreeName treeName) {
             try {
-                // FIXME: how do we set the comparator?
                 final Tree tree = getVolume(treeName).getTree(treeName.toString(), true);
                 trees.put(treeName, tree);
             } catch (PersistitException e) {
@@ -336,14 +330,14 @@
 
 
 
-  private File backendDirectory;
-  private PersistitBackendCfg config;
+    private File backendDirectory;
+    private PersistitBackendCfg config;
     private Persistit db;
-    private final ConcurrentMap<TreeName, Volume> volumes = new ConcurrentHashMap<TreeName, Volume>();
+    private final ConcurrentMap<String, Volume> volumes = new ConcurrentHashMap<String, Volume>();
     private Properties properties;
 
     private Volume getVolume(TreeName treeName) {
-        return volumes.get(treeName.getSuffix());
+        return volumes.get(treeName.getBaseDN());
     }
 
     @Override
@@ -385,8 +379,7 @@
             db.initialize();
             for (DN baseDN : config.getBaseDN()) {
                 final String volumeName = toSuffixName(baseDN.toString());
-                final TreeName suffixName = TreeName.of(volumeName);
-                volumes.put(suffixName, db.loadVolume(volumeName));
+                volumes.put(volumeName, db.loadVolume(volumeName));
             }
         } catch (PersistitException e) {
             throw new StorageRuntimeException(e);
@@ -476,15 +469,6 @@
         }
     }
 
-    @Override
-    public Cursor openCursor(TreeName treeName) {
-        try {
-            return new CursorImpl(getExchange0(treeName, false));//FIXME JNR we must release the exchange
-        } catch (PersistitException e) {
-            throw new StorageRuntimeException(e);
-        }
-    }
-
     private Exchange getExchange0(TreeName treeName, boolean create) throws PersistitException {
         return db.getExchange(getVolume(treeName), treeName.toString(), create);
     }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
index 93fd5bb..09a89bf 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -250,7 +250,8 @@
 
   private TreeName getIndexName(AttributeType attrType, String indexID)
   {
-    return entryContainer.getDatabasePrefix().child(attrType.getNameOrOID() + "." + indexID);
+    final String attrIndexId = attrType.getNameOrOID() + "." + indexID;
+    return new TreeName(entryContainer.getDatabasePrefix(), attrIndexId);
   }
 
   /**
@@ -448,7 +449,7 @@
    * to both a lower bound and an upper bound.
    *
    * @param indexQueryFactory
-   *          The index query factory to use for the evaluation 
+   *          The index query factory to use for the evaluation
    * @param filter1
    *          The first filter, that is either a less-or-equal filter or a
    *          greater-or-equal filter.
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/DbPreloadComparator.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/DbPreloadComparator.java
index 3bb4570..bc3e971 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/DbPreloadComparator.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/DbPreloadComparator.java
@@ -46,8 +46,7 @@
    */
   static private int priority(DatabaseContainer database)
   {
-    TreeName name = database.getName();
-    String indexName = name.getIndex().toString();
+    String indexName = database.getName().getIndexId();
     if (indexName.endsWith(SuffixContainer.ID2ENTRY_INDEX_NAME))
     {
       return 1;
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
index 8debe7b..56d16ce 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
@@ -168,7 +168,7 @@
    * Prevents name clashes for common indexes (like id2entry) across multiple suffixes.
    * For example when a root container contains multiple suffixes.
    */
-  private TreeName databasePrefix;
+  private String databasePrefix;
 
   /**
    * This class is responsible for managing the configuration for attribute
@@ -440,7 +440,7 @@
    * @param rootContainer The root container this entry container is in.
    * @throws ConfigException if a configuration related error occurs.
    */
-  public EntryContainer(DN baseDN, TreeName databasePrefix, Backend<?> backend,
+  public EntryContainer(DN baseDN, String databasePrefix, Backend<?> backend,
       PersistitBackendCfg config, Storage env, RootContainer rootContainer)
           throws ConfigException
   {
@@ -462,6 +462,11 @@
     config.addBackendVLVIndexDeleteListener(vlvJEIndexCfgManager);
   }
 
+  private TreeName getIndexName(String indexId)
+  {
+    return new TreeName(databasePrefix, indexId);
+  }
+
   /**
    * Opens the entryContainer for reading and writing.
    *
@@ -477,14 +482,13 @@
             config.isCompactEncoding(),
             rootContainer.getCompressedSchema());
 
-      id2entry = new ID2Entry(databasePrefix.child(ID2ENTRY_DATABASE_NAME),
-          entryDataConfig, storage, this);
+      id2entry = new ID2Entry(getIndexName(ID2ENTRY_DATABASE_NAME), entryDataConfig, storage, this);
       id2entry.open(txn);
 
-      dn2id = new DN2ID(databasePrefix.child(DN2ID_DATABASE_NAME), storage, this);
+      dn2id = new DN2ID(getIndexName(DN2ID_DATABASE_NAME), storage, this);
       dn2id.open(txn);
 
-      state = new State(databasePrefix.child(STATE_DATABASE_NAME), storage, this);
+      state = new State(getIndexName(STATE_DATABASE_NAME), storage, this);
       state.open(txn);
 
       if (config.isSubordinateIndexesEnabled())
@@ -495,12 +499,12 @@
       {
         // Use a null index and ensure that future attempts to use the real
         // subordinate indexes will fail.
-        id2children = new NullIndex(databasePrefix.child(ID2CHILDREN_DATABASE_NAME),
+        id2children = new NullIndex(getIndexName(ID2CHILDREN_DATABASE_NAME),
             new ID2CIndexer(), state, storage, txn, this);
         state.putIndexTrustState(txn, id2children, false);
         id2children.open(txn); // No-op
 
-        id2subtree = new NullIndex(databasePrefix.child(ID2SUBTREE_DATABASE_NAME),
+        id2subtree = new NullIndex(getIndexName(ID2SUBTREE_DATABASE_NAME),
             new ID2SIndexer(), state, storage, txn, this);
         state.putIndexTrustState(txn, id2subtree, false);
         id2subtree.open(txn); // No-op
@@ -508,7 +512,7 @@
         logger.info(NOTE_JEB_SUBORDINATE_INDEXES_DISABLED, backend.getBackendID());
       }
 
-      dn2uri = new DN2URI(databasePrefix.child(REFERRAL_DATABASE_NAME), storage, this);
+      dn2uri = new DN2URI(getIndexName(REFERRAL_DATABASE_NAME), storage, this);
       dn2uri.open(txn);
 
       for (String idx : config.listBackendIndexes())
@@ -2901,7 +2905,7 @@
    *
    * @return The container name for the base DN.
    */
-  public TreeName getDatabasePrefix()
+  public String getDatabasePrefix()
   {
     return databasePrefix;
   }
@@ -2910,10 +2914,10 @@
    * Sets a new database prefix for this entry container and rename all
    * existing databases in use by this entry container.
    *
-   * @param newDatabasePrefix The new database prefix to use.
+   * @param newBaseDN The new database prefix to use.
    * @throws StorageRuntimeException If an error occurs in the JE database.
    */
-  public void setDatabasePrefix(final TreeName newDatabasePrefix) throws StorageRuntimeException
+  public void setDatabasePrefix(final String newBaseDN) throws StorageRuntimeException
   {
     final List<DatabaseContainer> databases = new ArrayList<DatabaseContainer>();
     listDatabases(databases);
@@ -2934,7 +2938,7 @@
           for(DatabaseContainer db : databases)
           {
             TreeName oldName = db.getName();
-            TreeName newName = oldName.replaceSuffix(newDatabasePrefix);
+            TreeName newName = oldName.replaceBaseDN(newBaseDN);
             txn.renameTree(oldName, newName);
           }
         }
@@ -2947,7 +2951,7 @@
           for (DatabaseContainer db : databases)
           {
             TreeName oldName = db.getName();
-            TreeName newName = oldName.replaceSuffix(newDatabasePrefix);
+            TreeName newName = oldName.replaceBaseDN(newBaseDN);
             db.setName(newName);
           }
         }
@@ -3051,13 +3055,13 @@
               // Disabling subordinate indexes. Use a null index and ensure that
               // future attempts to use the real indexes will fail.
               id2children.close();
-              id2children = new NullIndex(databasePrefix.child(ID2CHILDREN_DATABASE_NAME),
+              id2children = new NullIndex(getIndexName(ID2CHILDREN_DATABASE_NAME),
                   new ID2CIndexer(), state, storage, txn, EntryContainer.this);
               state.putIndexTrustState(txn, id2children, false);
               id2children.open(txn); // No-op
 
               id2subtree.close();
-              id2subtree = new NullIndex(databasePrefix.child(ID2SUBTREE_DATABASE_NAME),
+              id2subtree = new NullIndex(getIndexName(ID2SUBTREE_DATABASE_NAME),
                   new ID2SIndexer(), state, storage, txn, EntryContainer.this);
               state.putIndexTrustState(txn, id2subtree, false);
               id2subtree.open(txn); // No-op
@@ -3229,7 +3233,7 @@
 
   private Index newIndex(WriteableStorage txn, String name, Indexer indexer)
   {
-    final Index index = new Index(databasePrefix.child(name),
+    final Index index = new Index(getIndexName(name),
         indexer, state, config.getIndexEntryLimit(), 0, true, storage, txn, this);
     index.open(txn);
     if (!index.isTrusted())
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/RootContainer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/RootContainer.java
index 543344e..9770a7d 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/RootContainer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/RootContainer.java
@@ -34,7 +34,6 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.config.server.ConfigException;
-import org.opends.messages.UtilityMessages;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.std.server.PersistitBackendCfg;
 import org.opends.server.api.Backend;
@@ -43,7 +42,6 @@
 import org.opends.server.backends.pluggable.spi.ReadOperation;
 import org.opends.server.backends.pluggable.spi.ReadableStorage;
 import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
-import org.opends.server.backends.pluggable.spi.TreeName;
 import org.opends.server.backends.pluggable.spi.WriteOperation;
 import org.opends.server.backends.pluggable.spi.WriteableStorage;
 import org.opends.server.core.DefaultCompressedSchema;
@@ -64,8 +62,8 @@
 import static org.opends.messages.BackendMessages.*;
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.messages.JebMessages.*;
-import static org.opends.messages.UtilityMessages.ERR_LDIF_SKIP;
-import static org.opends.server.core.DirectoryServer.getServerErrorResultCode;
+import static org.opends.messages.UtilityMessages.*;
+import static org.opends.server.core.DirectoryServer.*;
 import static org.opends.server.util.StaticUtils.*;
 
 /**
@@ -373,26 +371,13 @@
       databasePrefix = name;
     }
 
-    EntryContainer ec = new EntryContainer(baseDN, toSuffixName(databasePrefix),
+    EntryContainer ec = new EntryContainer(baseDN, storage.toSuffixName(databasePrefix),
                                            backend, config, storage, this);
     ec.open(txn);
     return ec;
   }
 
   /**
-   * Transform a database prefix string to one usable by the DB.
-   *
-   * @param databasePrefix
-   *          the database prefix
-   * @return a new string when non letter or digit characters have been replaced
-   *         with underscore
-   */
-  private TreeName toSuffixName(String databasePrefix)
-  {
-    return TreeName.of(storage.toSuffixName(databasePrefix));
-  }
-
-  /**
    * Registers the entry container for a base DN.
    *
    * @param baseDN The base DN of the entry container to close.
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java
index fc25a93..21b0e1d 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java
@@ -50,6 +50,7 @@
 import org.opends.server.backends.pluggable.spi.ReadableStorage;
 import org.opends.server.backends.pluggable.spi.Storage;
 import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
+import org.opends.server.backends.pluggable.spi.TreeName;
 import org.opends.server.backends.pluggable.spi.WriteOperation;
 import org.opends.server.backends.pluggable.spi.WriteableStorage;
 import org.opends.server.controls.ServerSideSortRequestControl;
@@ -132,8 +133,7 @@
                   EntryContainer entryContainer, ReadableStorage txn)
       throws StorageRuntimeException, ConfigException
   {
-    super(entryContainer.getDatabasePrefix().child("vlv."+config.getName()),
-          env, entryContainer);
+    super(new TreeName(entryContainer.getDatabasePrefix(), "vlv." + config.getName()), env, entryContainer);
 
     this.config = config;
     this.baseDN = config.getBaseDN();
@@ -719,7 +719,7 @@
     {
       debugBuilder.append("vlv=");
       debugBuilder.append("[INDEX:");
-      debugBuilder.append(treeName.getIndex());
+      debugBuilder.append(treeName.getIndexId());
       debugBuilder.append("]");
     }
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java
index 0a12e6e..fa100c3 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java
@@ -25,90 +25,33 @@
  */
 package org.opends.server.backends.pluggable.spi;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
 /** Assumes name components don't contain a '/'. */
 public final class TreeName
 {
-  public static TreeName of(final String... names)
-  {
-    return new TreeName(Arrays.asList(names));
-  }
-
-  private final List<String> names;
+  private final String baseDN;
+  private final String indexId;
   private final String s;
 
-  public TreeName(final List<String> names)
+  public TreeName(String baseDN, String indexId)
   {
-    this.names = names;
-    final StringBuilder builder = new StringBuilder();
-    for (final String name : names)
-    {
-      builder.append('/');
-      builder.append(name);
-    }
-    this.s = builder.toString();
+    this.baseDN = baseDN;
+    this.indexId = indexId;
+    this.s = '/' + baseDN + '/' + indexId;
   }
 
-  public List<String> getNames()
+  public String getBaseDN()
   {
-    return names;
+    return baseDN;
   }
 
-  public TreeName child(final String name)
+  public TreeName replaceBaseDN(String newBaseDN)
   {
-    final List<String> newNames = new ArrayList<String>(names.size() + 1);
-    newNames.addAll(names);
-    newNames.add(name);
-    return new TreeName(newNames);
+    return new TreeName(newBaseDN, indexId);
   }
 
-  public TreeName getSuffix()
+  public String getIndexId()
   {
-    if (names.size() == 0)
-    {
-      throw new IllegalStateException();
-    }
-    return new TreeName(Collections.singletonList(names.get(0)));
-  }
-
-  public TreeName replaceSuffix(TreeName newSuffix)
-  {
-    if (names.size() == 0)
-    {
-      throw new IllegalStateException();
-    }
-    final ArrayList<String> newNames = new ArrayList<String>(names);
-    newNames.set(0, newSuffix.names.get(0));
-    return new TreeName(newNames);
-  }
-
-  public boolean isSuffixOf(TreeName treeName)
-  {
-    if (names.size() > treeName.names.size())
-    {
-      return false;
-    }
-    for (int i = 0; i < names.size(); i++)
-    {
-      if (!treeName.names.get(i).equals(names.get(i)))
-      {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  public TreeName getIndex()
-  {
-    if (names.size() == 1)
-    {
-      return null;
-    }
-    return new TreeName(names.subList(1, names.size()));
+    return indexId;
   }
 
   @Override

--
Gitblit v1.10.0