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