From a42d8edc14f3ff2eb4dd85f1483490d8137fdef2 Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Fri, 16 May 2008 14:18:26 +0000
Subject: [PATCH] Fixes to  improve performance using default JVM ergonomics:

---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java |   97 ++++++++++++++++++++++++++++++++++--------------
 1 files changed, 69 insertions(+), 28 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
index b9874cb..b8e1c71 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
@@ -114,6 +114,9 @@
    */
   private boolean rebuildRunning = false;
 
+  //Thread local area to store per thread cursors.
+  private ThreadLocal<Cursor> curLocal = new ThreadLocal<Cursor>();
+
 
   /**
    * Create a new index object.
@@ -312,45 +315,66 @@
 
 
   /**
-   * Add the specified import ID set to the provided key. Used during
-   * substring buffer flushing.
+   * Insert the specified import ID set into this index a the provided key.
    *
-   * @param txn A transaction.
    * @param key The key to add the set to.
    * @param importIdSet The set of import IDs.
-   * @param data Database entry to reuse for read
+   * @param data Database entry to reuse for read.
+   * @param cursor A database cursor to use.
    * @throws DatabaseException If an database error occurs.
    */
-  public void insert(Transaction txn, DatabaseEntry key,
-                     ImportIDSet importIdSet, DatabaseEntry data)
-  throws DatabaseException {
 
-    OperationStatus status;
-      status = read(txn, key, data, LockMode.RMW);
-      if(status == OperationStatus.SUCCESS) {
-        ImportIDSet newImportIDSet = new IntegerImportIDSet();
-        if (newImportIDSet.merge(data.getData(), importIdSet,
-                                 indexEntryLimit, maintainCount)) {
-          entryLimitExceededCount++;
-        }
-        data.setData(newImportIDSet.toDatabase());
-      } else if(status == OperationStatus.NOTFOUND) {
-        if(!importIdSet.isDefined()) {
-          entryLimitExceededCount++;
-        }
-        data.setData(importIdSet.toDatabase());
-      } else {
-        //Should never happen during import.
-        throw new DatabaseException();
+  private void
+  insert(DatabaseEntry key, ImportIDSet importIdSet,
+         DatabaseEntry data, Cursor cursor) throws DatabaseException {
+    OperationStatus status =
+            cursor.getSearchKey(key, data, LockMode.DEFAULT);
+    if(status == OperationStatus.SUCCESS) {
+      ImportIDSet newImportIDSet = new IntegerImportIDSet();
+      if (newImportIDSet.merge(data.getData(), importIdSet,
+              indexEntryLimit, maintainCount) && importIdSet.isDirty()) {
+        entryLimitExceededCount++;
+        importIdSet.setDirty(false);
       }
-      put(txn,key, data);
+      data.setData(newImportIDSet.toDatabase());
+      cursor.putCurrent(data);
+    } else if(status == OperationStatus.NOTFOUND) {
+      if(!importIdSet.isDefined() && importIdSet.isDirty()) {
+        entryLimitExceededCount++;
+        importIdSet.setDirty(false);
+      }
+      data.setData(importIdSet.toDatabase());
+      cursor.put(key,data);
+    } else {
+      //Should never happen during import.
+      throw new DatabaseException();
+    }
+  }
+
+  /**
+   * Insert the specified import ID set into this index. Creates a DB
+   * cursor if needed.
+   *
+   * @param key The key to add the set to.
+   * @param importIdSet The set of import IDs.
+   * @param data Database entry to reuse for read.
+   * @throws DatabaseException If a database error occurs.
+   */
+  public void
+  insert(DatabaseEntry key, ImportIDSet importIdSet,
+         DatabaseEntry data) throws DatabaseException {
+    Cursor cursor = curLocal.get();
+    if(cursor == null) {
+      cursor = openCursor(null, null);
+      curLocal.set(cursor);
+    }
+    insert(key, importIdSet, data, cursor);
   }
 
 
   /**
    * Add the specified import ID set to the provided keys in the keyset.
    *
-   * @param txn  A transaction.
    * @param importIDSet A import ID set to use.
    * @param keySet  The set containing the keys.
    * @param keyData A key database entry to use.
@@ -358,13 +382,19 @@
    * @return <CODE>True</CODE> if the insert was successful.
    * @throws DatabaseException If a database error occurs.
    */
+
   public synchronized
-  boolean insert(Transaction txn, ImportIDSet importIDSet, Set<byte[]> keySet,
+  boolean insert(ImportIDSet importIDSet, Set<byte[]> keySet,
                  DatabaseEntry keyData, DatabaseEntry data)
           throws DatabaseException {
+    Cursor cursor = curLocal.get();
+    if(cursor == null) {
+      cursor = openCursor(null, null);
+      curLocal.set(cursor);
+    }
     for(byte[] key : keySet) {
       keyData.setData(key);
-      insert(txn, keyData, importIDSet, data);
+      insert(keyData, importIDSet, data, cursor);
     }
     keyData.setData(null);
     data.setData(null);
@@ -1131,6 +1161,17 @@
   }
 
   /**
+   * Close any cursors open against this index.
+   *
+   * @throws DatabaseException  If a database error occurs.
+   */
+  public void closeCursor() throws DatabaseException {
+    Cursor cursor = curLocal.get();
+    if(cursor != null) {
+      cursor.close();
+    }
+  }
+  /**
    * Increment the count of the number of keys that have exceeded the entry
    * limit since this object was created.
    */

--
Gitblit v1.10.0