From 642e1f844e7b37d2d8306c4d4300123f46f85558 Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Tue, 24 Feb 2015 13:35:36 +0000
Subject: [PATCH] OPENDJ-1800 Find a better way to manage database prefix names in a Storage

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java         |    6 +-
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/RootContainer.java    |   20 +--------
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java   |    9 +---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java      |    2 
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java         |   17 +++++++-
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/Storage.java      |    9 ----
 opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java |   34 +++++++++++------
 7 files changed, 47 insertions(+), 50 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java
index c7cd72f..3a3a43b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java
@@ -231,7 +231,7 @@
     {
       try
       {
-        final Tree tree = volume.getTree(treeName.toString(), true);
+        final Tree tree = volume.getTree(mangleTreeName(treeName), true);
         trees.put(treeName, tree);
       }
       catch (final PersistitException e)
@@ -401,8 +401,7 @@
     }
 
     @Override
-    public void renameTree(final TreeName oldTreeName,
-        final TreeName newTreeName)
+    public void renameTree(final TreeName oldTreeName, final TreeName newTreeName)
     {
       throw new UnsupportedOperationException();
     }
@@ -473,6 +472,12 @@
       }
       exchanges.clear();
     }
+
+    private Exchange getNewExchange(final TreeName treeName, final boolean create)
+        throws PersistitException
+    {
+      return db.getExchange(volume, mangleTreeName(treeName), create);
+    }
   }
 
   private static void clearAndCreateDbDir(final File dbDir)
@@ -640,10 +645,21 @@
     return new ImporterImpl();
   }
 
-  /** {@inheritDoc} */
-  public String toSafeSuffixName(final String suffix)
+  private String mangleTreeName(final TreeName treeName)
   {
-    return suffix.replaceAll("[,=]", "_");
+    StringBuilder mangled = new StringBuilder();
+    String name = treeName.toString();
+
+    for (int idx = 0; idx < name.length(); idx++)
+    {
+      char ch = name.charAt(idx);
+      if (ch == '=' || ch == ',')
+      {
+        ch = '_';
+      }
+      mangled.append(ch);
+    }
+    return mangled.toString();
   }
 
   /** {@inheritDoc} */
@@ -722,12 +738,6 @@
     return value;
   }
 
-  private Exchange getNewExchange(final TreeName treeName, final boolean create)
-      throws PersistitException
-  {
-    return db.getExchange(volume, treeName.toString(), create);
-  }
-
   private ByteString keyToBytes(final Key key)
   {
     return ByteString.wrap(key.reset().decodeByteArray());
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
index 4ca4025..33aae6a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
@@ -926,7 +926,7 @@
         try
         {
           // The base DN was added.
-          EntryContainer ec = rootContainer.openEntryContainer(baseDN, null, txn);
+          EntryContainer ec = rootContainer.openEntryContainer(baseDN, txn);
           rootContainer.registerEntryContainer(baseDN, ec);
           DirectoryServer.registerBaseDN(baseDN, this, false);
         }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
index 376e990..567129a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
@@ -431,8 +431,6 @@
    *
    * @param baseDN  The baseDN this entry container will be responsible for
    *                storing on disk.
-   * @param databasePrefix The prefix to use in the database names used by
-   *                       this entry container.
    * @param backend A reference to the JE backend that is creating this entry
    *                container. It is needed by the Directory Server entry cache
    *                methods.
@@ -441,16 +439,15 @@
    * @param rootContainer The root container this entry container is in.
    * @throws ConfigException if a configuration related error occurs.
    */
-  EntryContainer(DN baseDN, String databasePrefix, Backend<?> backend,
-      PluggableBackendCfg config, Storage env, RootContainer rootContainer)
-          throws ConfigException
+  EntryContainer(DN baseDN, Backend<?> backend, PluggableBackendCfg config, Storage env, RootContainer rootContainer)
+      throws ConfigException
   {
     this.backend = backend;
     this.baseDN = baseDN;
     this.config = config;
     this.storage = env;
     this.rootContainer = rootContainer;
-    this.databasePrefix = databasePrefix;
+    this.databasePrefix = baseDN.toIrreversibleReadableString();
 
     config.addPluggableChangeListener(this);
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java
index 214bb71..67a73ea 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java
@@ -786,14 +786,27 @@
         {
           // Create a temp entry container
           sourceEntryContainer = entryContainer;
-          final String name = baseDN.toIrreversibleReadableString() + "_importTmp";
-          entryContainer = rootContainer.openEntryContainer(baseDN, name, txn);
+          entryContainer = createEntryContainer(txn, baseDN);
         }
       }
     }
     return new Suffix(entryContainer, sourceEntryContainer, includeBranches, excludeBranches);
   }
 
+  private EntryContainer createEntryContainer(WriteableStorage txn, DN baseDN) throws ConfigException
+  {
+    DN tempDN;
+    try
+    {
+      tempDN = baseDN.child(DN.valueOf("dc=importTmp"));
+    }
+    catch (DirectoryException e)
+    {
+      throw new ConfigException(e.getMessageObject());
+    }
+    return rootContainer.openEntryContainer(tempDN, txn);
+  }
+
   private void clearSuffix(EntryContainer entryContainer)
   {
     entryContainer.lock();
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/RootContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/RootContainer.java
index f887025..d9e854a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/RootContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/RootContainer.java
@@ -368,9 +368,6 @@
    *
    * @param baseDN
    *          The base DN of the entry container to open.
-   * @param name
-   *          The name of the entry container or <CODE>NULL</CODE> to open the
-   *          default entry container for the given base DN.
    * @param txn
    *          The database transaction
    * @return The opened entry container.
@@ -379,21 +376,10 @@
    * @throws ConfigException
    *           If an configuration error occurs while opening the entry container.
    */
-  EntryContainer openEntryContainer(DN baseDN, String name, WriteableStorage txn)
+  EntryContainer openEntryContainer(DN baseDN, WriteableStorage txn)
       throws StorageRuntimeException, ConfigException
   {
-    String databasePrefix;
-    if (name == null || "".equals(name))
-    {
-      databasePrefix = baseDN.toIrreversibleReadableString();
-    }
-    else
-    {
-      databasePrefix = name;
-    }
-
-    EntryContainer ec =
-        new EntryContainer(baseDN, storage.toSafeSuffixName(databasePrefix), backend, config, storage, this);
+    EntryContainer ec = new EntryContainer(baseDN, backend, config, storage, this);
     ec.open(txn);
     return ec;
   }
@@ -443,7 +429,7 @@
     EntryID highestID = null;
     for (DN baseDN : baseDNs)
     {
-      EntryContainer ec = openEntryContainer(baseDN, null, txn);
+      EntryContainer ec = openEntryContainer(baseDN, txn);
       EntryID id = ec.getHighestEntryID(txn);
       registerEntryContainer(baseDN, ec);
       if (highestID == null || id.compareTo(highestID) > 0)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
index 3c7e447..7280260 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
@@ -120,7 +120,7 @@
    * @param config           The VLV index config object to use for this VLV
    *                         index.
    * @param state            The state database to persist vlvIndex state info.
-   * @param env              The JE Storage
+   * @param storage          The storage currently in use
    * @param entryContainer   The database entryContainer holding this vlvIndex. the sort order
    * @param txn              The transaction to use when creating this object
    * @throws StorageRuntimeException
@@ -128,10 +128,10 @@
    * @throws ConfigException if a error occurs while reading the VLV index
    * configuration
    */
-  VLVIndex(BackendVLVIndexCfg config, State state, Storage env, EntryContainer entryContainer, WriteableStorage txn)
+  VLVIndex(BackendVLVIndexCfg config, State state, Storage storage, EntryContainer entryContainer, WriteableStorage txn)
       throws StorageRuntimeException, ConfigException
   {
-    super(new TreeName(entryContainer.getDatabasePrefix(), "vlv." + config.getName()), env, entryContainer);
+    super(new TreeName(entryContainer.getDatabasePrefix(), "vlv." + config.getName()), storage, entryContainer);
 
     this.config = config;
     this.baseDN = config.getBaseDN();
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/Storage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/Storage.java
index d556490..004b604 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/Storage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/Storage.java
@@ -122,13 +122,4 @@
    * @throws StorageRuntimeException if removal fails
    */
   void removeStorageFiles() throws StorageRuntimeException;
-
-  /**
-   * Replace reserved characters with an underscore character.
-   *
-   * @param databasePrefix
-   *          the suffix name to convert
-   * @return a new String suitable for use as a suffix name
-   */
-  String toSafeSuffixName(String databasePrefix);
 }

--
Gitblit v1.10.0