From 65aba8bb05fb4a117a527496be2d0342b343963a Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Sat, 14 Mar 2015 01:46:09 +0000
Subject: [PATCH] OPENDJ-1848: minor improvements to DatabaseContainer
---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java | 17 ++---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DatabaseContainer.java | 59 +++++++++----------
opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java | 20 ++++++
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/NullIndex.java | 16 +++++
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/ReadableStorage.java | 9 +++
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/TracedStorage.java | 16 +++++
6 files changed, 95 insertions(+), 42 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 a7fb337..ef68ce8 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
@@ -326,6 +326,26 @@
}
@Override
+ public long getRecordCount(TreeName treeName)
+ {
+ // FIXME: is the a better/quicker way to do this?
+ final Cursor cursor = openCursor(treeName);
+ try
+ {
+ long count = 0;
+ while (cursor.next())
+ {
+ count++;
+ }
+ return count;
+ }
+ finally
+ {
+ cursor.close();
+ }
+ }
+
+ @Override
public ByteString getRMW(final TreeName treeName, final ByteSequence key)
{
return read(treeName, key);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DatabaseContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DatabaseContainer.java
index dacfb17..c932b59 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DatabaseContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DatabaseContainer.java
@@ -26,7 +26,6 @@
*/
package org.opends.server.backends.pluggable;
-import org.opends.server.backends.pluggable.spi.Cursor;
import org.opends.server.backends.pluggable.spi.ReadableStorage;
import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
import org.opends.server.backends.pluggable.spi.TreeName;
@@ -52,51 +51,49 @@
}
/**
- * Opens a JE database in this database container. If the provided
- * database configuration is transactional, a transaction will be
- * created and used to perform the open.
+ * Opens a JE database in this database container. If the provided database configuration is
+ * transactional, a transaction will be created and used to perform the open.
*
- * @param txn The JE transaction handle, or null if none.
- * @throws StorageRuntimeException if a JE database error occurs while
- * opening the index.
+ * @param txn
+ * The transaction.
+ * @throws StorageRuntimeException
+ * if a JE database error occurs while opening the index.
*/
void open(WriteableStorage txn) throws StorageRuntimeException
{
- // FIXME: remove?
txn.openTree(name);
}
/**
- * Get the count of key/data pairs in the database in a JE database.
- * This is a simple wrapper around the JE Database.count method.
- * @param txn The JE transaction handle, or null if none.
- * @return The count of key/data pairs in the database.
- * @throws StorageRuntimeException If an error occurs in the JE operation.
+ * Deletes this database and all of its contents.
+ *
+ * @param txn
+ * The transaction.
+ * @throws StorageRuntimeException
+ * if a database error occurs while deleting the index.
+ */
+ void delete(WriteableStorage txn) throws StorageRuntimeException
+ {
+ txn.deleteTree(name);
+ }
+
+ /**
+ * Returns the number of key/value pairs in this database container.
+ *
+ * @param txn
+ * The transaction.
+ * @return the number of key/value pairs in the provided tree.
+ * @throws StorageRuntimeException
+ * If an error occurs in the DB operation.
*/
long getRecordCount(ReadableStorage txn) throws StorageRuntimeException
{
- /*
- * FIXME: push down to storage. Some DBs have native support for this, e.g. using counted
- * B-Trees.
- */
- final Cursor cursor = txn.openCursor(name);
- try
- {
- long count = 0;
- while (cursor.next())
- {
- count++;
- }
- return count;
- }
- finally
- {
- cursor.close();
- }
+ return txn.getRecordCount(name);
}
/**
* Get a string representation of this object.
+ *
* @return return A string representation of this object.
*/
@Override
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 698c897..91c78b2 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
@@ -545,12 +545,7 @@
private NullIndex openNewNullIndex(WriteableStorage txn, String indexId, Indexer indexer)
{
- final TreeName indexName = getIndexName(indexId);
- final NullIndex index = new NullIndex(indexName, indexer, state, txn, this);
- state.putIndexTrustState(txn, index, false);
- txn.deleteTree(indexName);
- index.open(txn); // No-op
- return index;
+ return new NullIndex(getIndexName(indexId), indexer, state, txn, this);
}
/**
@@ -2801,7 +2796,7 @@
for (DatabaseContainer db : databases)
{
- txn.deleteTree(db.getName());
+ db.delete(txn);
}
}
@@ -2820,7 +2815,7 @@
// The state database can not be removed individually.
return;
}
- txn.deleteTree(database.getName());
+ database.delete(txn);
if(database instanceof Index)
{
state.removeIndexTrustState(txn, database);
@@ -2839,7 +2834,7 @@
attributeIndex.close();
for (Index index : attributeIndex.getAllIndexes())
{
- txn.deleteTree(index.getName());
+ index.delete(txn);
state.removeIndexTrustState(txn, index);
}
}
@@ -3063,7 +3058,7 @@
{
for (DatabaseContainer db : databases)
{
- txn.deleteTree(db.getName());
+ db.delete(txn);
}
}
finally
@@ -3095,7 +3090,7 @@
{
try
{
- txn.deleteTree(database.getName());
+ database.delete(txn);
}
finally
{
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/NullIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/NullIndex.java
index 2c9d460..dbf5d52 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/NullIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/NullIndex.java
@@ -25,6 +25,7 @@
package org.opends.server.backends.pluggable;
import java.util.List;
+import java.util.Set;
import org.forgerock.opendj.ldap.ByteSequence;
import org.forgerock.opendj.ldap.ByteString;
@@ -48,6 +49,8 @@
EntryContainer entryContainer) throws StorageRuntimeException
{
super(name, indexer, state, 0, 0, false, txn, entryContainer);
+ state.putIndexTrustState(txn, this, false);
+ super.delete(txn);
}
@Override
@@ -163,4 +166,17 @@
{
return 0;
}
+
+ @Override
+ void delete(WriteableStorage txn) throws StorageRuntimeException
+ {
+ // Do nothing.
+ }
+
+ @Override
+ void indexEntry(Entry entry, Set<ByteString> keys, IndexingOptions options)
+ {
+ // Do nothing.
+ }
+
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/TracedStorage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/TracedStorage.java
index 2a5d22d..f9bae50 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/TracedStorage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/TracedStorage.java
@@ -95,6 +95,14 @@
}
@Override
+ public long getRecordCount(TreeName name)
+ {
+ final long count = txn.getRecordCount(name);
+ logger.trace("Storage.ReadableStorage.getRecordCount(%s, %s) = %d", backendId, name, count);
+ return count;
+ }
+
+ @Override
public ByteString getRMW(final TreeName name, final ByteSequence key)
{
final ByteString value = txn.getRMW(name, key);
@@ -155,6 +163,14 @@
}
@Override
+ public long getRecordCount(TreeName name)
+ {
+ final long count = txn.getRecordCount(name);
+ logger.trace("Storage.WriteableStorage.getRecordCount(%s, %s) = %d", backendId, name, count);
+ return count;
+ }
+
+ @Override
public ByteString getRMW(final TreeName name, final ByteSequence key)
{
final ByteString value = txn.getRMW(name, key);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/ReadableStorage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/ReadableStorage.java
index bbb856d..8731037 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/ReadableStorage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/ReadableStorage.java
@@ -66,4 +66,13 @@
* @return a new cursor
*/
Cursor openCursor(TreeName treeName);
+
+ /**
+ * Returns the number of key/value pairs in the provided tree.
+ *
+ * @param treeName
+ * the tree name
+ * @return the number of key/value pairs in the provided tree.
+ */
+ long getRecordCount(TreeName treeName);
}
\ No newline at end of file
--
Gitblit v1.10.0