mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Fabio Pistolesi
24.35.2015 642e1f844e7b37d2d8306c4d4300123f46f85558
OPENDJ-1800 Find a better way to manage database prefix names in a Storage

We now use TreeNames all along and derive the databasePrefix from the suffix instead of passing it as parameter to a new EntryContainer.
The storage will mangle names as needed by itself.
7 files modified
97 ■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java 34 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java 2 ●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java 9 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java 17 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/RootContainer.java 20 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java 6 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/Storage.java 9 ●●●●● patch | view | raw | blame | history
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());
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);
        }
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);
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();
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)
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();
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);
}