From 325b2ee4a27d0c24aa0a539f7bd0a8cf24905ff7 Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Tue, 10 Apr 2007 20:41:27 +0000
Subject: [PATCH] Added the following capabilities to OpenDS: - Index rebuilding capabilities. All indexes including system and attribute indexes can be rebuilt. Each index will be rebuilt by a seperate thread to increase performance. A max number of rebuild threads could be set to limit the resources used by large rebuild jobs. Partial rebuilds of attribute indexes could also be done by specifying the attribute index type after the attribute type (ie. sn.approximate). - Index rebuilding standalone tool. Rebuilding of attribute indexes could be done with the backend online. However, rebuilds including system indexes must be done with the backend offline. - Index rebuilding task. Rebuilding of attribute indexes are done with the backend online. Rebuilds that include system indexes will be performed after bring the backend offline. The user must have index-rebuild privilages to rebuild indexes. - Approxitae indexing capability. The value of the attribute will be normalized using the approximate maching rule of that attribute type. This is used as the key for the index. Approximate indexes are fully supported by the index verify, rebuild, and import jobs. - Fixed bug in build.xml where weave is enabled even if a test.* property is set. - Consolidated some common tool messages. - Consolidated some JE backend methods common to all tools. - Added unit tests for rebuild job and approximate indexes.
---
opends/src/server/org/opends/server/backends/jeb/DN2ID.java | 86 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 78 insertions(+), 8 deletions(-)
diff --git a/opends/src/server/org/opends/server/backends/jeb/DN2ID.java b/opends/src/server/org/opends/server/backends/jeb/DN2ID.java
index 09dce48..d55cc8a 100644
--- a/opends/src/server/org/opends/server/backends/jeb/DN2ID.java
+++ b/opends/src/server/org/opends/server/backends/jeb/DN2ID.java
@@ -26,7 +26,6 @@
*/
package org.opends.server.backends.jeb;
-import com.sleepycat.je.BtreeStats;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.CursorConfig;
import com.sleepycat.je.Database;
@@ -35,11 +34,15 @@
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
-import com.sleepycat.je.StatsConfig;
import com.sleepycat.je.Transaction;
import org.opends.server.types.DN;
+import org.opends.server.types.DebugLogLevel;
import org.opends.server.util.StaticUtils;
+import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
+import static org.opends.server.loggers.debug.DebugLogger.debugInfo;
+import static org.opends.server.loggers.debug.DebugLogger.debugVerbose;
+import static org.opends.server.loggers.debug.DebugLogger.debugCaught;
/**
* This class represents the DN database, or dn2id, which has one record
@@ -111,6 +114,12 @@
{
database = entryContainer.openDatabase(dbConfig, name);
threadLocalDatabase.set(database);
+
+ if(debugEnabled())
+ {
+ debugInfo("JE DN2ID database %s opened with %d records.",
+ database.getDatabaseName(), database.count());
+ }
}
return database;
}
@@ -265,17 +274,78 @@
}
/**
- * Compute the count of the number of records stored. This can be a
- * long running computation as it must walk the entire btree.
+ * Removes all records from the database.
+ * @param txn A JE database transaction to be used during the clear operation
+ * or null if not required. Using transactions increases the chance
+ * of lock contention.
+ * @return The number of records removed.
+ * @throws DatabaseException If an error occurs while cleaning the database.
+ */
+ public long clear(Transaction txn) throws DatabaseException
+ {
+ long deletedCount = 0;
+ Cursor cursor = openCursor(txn, null);
+ try
+ {
+ if(debugEnabled())
+ {
+ debugVerbose("%d existing records will be deleted from the " +
+ "database", getRecordCount());
+ }
+ DatabaseEntry data = new DatabaseEntry();
+ DatabaseEntry key = new DatabaseEntry();
+
+ OperationStatus status;
+
+ // Step forward until we deleted all records.
+ for (status = cursor.getFirst(key, data, LockMode.DEFAULT);
+ status == OperationStatus.SUCCESS;
+ status = cursor.getNext(key, data, LockMode.DEFAULT))
+ {
+ cursor.delete();
+ deletedCount++;
+ }
+ if(debugEnabled())
+ {
+ debugVerbose("%d records deleted", deletedCount);
+ }
+ }
+ catch(DatabaseException de)
+ {
+ if(debugEnabled())
+ {
+ debugCaught(DebugLogLevel.ERROR, de);
+ }
+
+ throw de;
+ }
+ finally
+ {
+ cursor.close();
+ }
+
+ return deletedCount;
+ }
+
+ /**
+ * Get the count of the number of entries stored.
*
- * @return The number of records stored.
+ * @return The number of entries stored.
*
* @throws DatabaseException If an error occurs in the JE database.
*/
- public long computeRecordCount() throws DatabaseException
+ public long getRecordCount() throws DatabaseException
{
- BtreeStats stats = (BtreeStats)getDatabase().getStats(new StatsConfig());
- return stats.getLeafNodeCount();
+ return EntryContainer.count(getDatabase());
+ }
+
+ /**
+ * Get a string representation of this object.
+ * @return return A string representation of this object.
+ */
+ public String toString()
+ {
+ return name;
}
}
--
Gitblit v1.10.0