From 3a3e25cd66f19b89dec18605635c61cb2ff0d2ee Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Fri, 04 Apr 2008 03:31:02 +0000
Subject: [PATCH] Performance improvement for when substring indexes move from defined to undefined.

---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/IntegerImportIDSet.java |    9 +++++++++
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/LongImportIDSet.java    |    9 +++++++++
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java        |    5 +++++
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/BufferManager.java      |   11 +++++++++--
 4 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/BufferManager.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/BufferManager.java
index 1835c05..3af10c5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/BufferManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/BufferManager.java
@@ -147,11 +147,18 @@
         KeyHashElement curElem = iter.next();
         //Never flush undefined elements.
         if(curElem.isDefined()) {
+          int oldSize = curElem.getMemorySize();
           Index index = curElem.getIndex();
           index.insert(null, new DatabaseEntry(curElem.getKey()),
                   curElem.getIDSet());
-          memoryUsage -= TREEMAP_ENTRY_OVERHEAD + curElem.getMemorySize();
-          iter.remove();
+          if(curElem.isDefined()) {
+             memoryUsage -= TREEMAP_ENTRY_OVERHEAD + curElem.getMemorySize();
+             iter.remove();
+          } else {
+            //Went undefined don't remove the element, just substract the
+            //memory size difference.
+            memoryUsage -= (oldSize - curElem.getMemorySize());
+          }
         }
       } else {
         //Wrapped around, start at the first element.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
index 63bf8fd..ebdaddc 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/ImportIDSet.java
@@ -80,4 +80,9 @@
    */
   public boolean merge(byte[] dbBytes, ImportIDSet bufImportIDSet,
                        int entryLimit);
+
+  /**
+   * Set the import ID set to the undefined state.
+   */
+  public void setUndefined();
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/IntegerImportIDSet.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/IntegerImportIDSet.java
index 79658a0..37b7db9 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/IntegerImportIDSet.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/IntegerImportIDSet.java
@@ -79,6 +79,14 @@
   }
 
 
+  /**
+   * {@inheritDoc}
+   */
+  public void setUndefined() {
+    array = null;
+    isDefined = false;
+  }
+
 
   /**
    * {@inheritDoc}
@@ -110,6 +118,7 @@
         isDefined=false;
         incrLimitCount=true;
         count = 0;
+        importIdSet.setUndefined();
       } else {
         count = array.length;
         addAll((IntegerImportIDSet) importIdSet);
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/LongImportIDSet.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/LongImportIDSet.java
index a5a8507..d06bccb 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/LongImportIDSet.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/LongImportIDSet.java
@@ -91,6 +91,14 @@
     return isDefined;
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  public void setUndefined() {
+    array = null;
+    isDefined = false;
+  }
+
 
   /**
    * {@inheritDoc}
@@ -121,6 +129,7 @@
       if(array.length + importIdSet.size() > limit) {
           isDefined=false;
           incrLimitCount=true;
+          importIdSet.setUndefined();
       } else {
         count = array.length;
         addAll((LongImportIDSet) importIdSet);

--
Gitblit v1.10.0