From 7294e5c0f8655e64353858e506c385efa8fc4e9e Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Mon, 12 May 2008 19:37:51 +0000
Subject: [PATCH] Increase import DB cache default percentage from 40% to 45%. Also, detect when substring indexing is turned off and use a bigger DB cache in that condition.

---
 opends/src/server/org/opends/server/backends/jeb/BackendImpl.java         |   14 +++++++++++++-
 opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java |   22 +++++++++++++++++-----
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java b/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
index 142a238..fb11878 100644
--- a/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
+++ b/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -66,6 +66,7 @@
 import org.opends.server.types.*;
 import static org.opends.server.util.ServerConstants.*;
 import org.opends.server.admin.std.server.LocalDBBackendCfg;
+import org.opends.server.admin.std.server.LocalDBIndexCfg;
 import org.opends.server.admin.Configuration;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.types.DN;
@@ -1192,7 +1193,18 @@
       envConfig.setTxnNoSync(false);
       envConfig.setConfigParam("je.env.isLocking", "false");
       envConfig.setConfigParam("je.env.runCheckpointer", "false");
-      Importer importer = new Importer(importConfig);
+      //Loop through local indexes and see if any are substring.
+      boolean hasSubIndex = false;
+      for (String idx : cfg.listLocalDBIndexes()) {
+        LocalDBIndexCfg indexCfg = cfg.getLocalDBIndex(idx);
+        Set<org.opends.server.admin.std.meta.LocalDBIndexCfgDefn.IndexType>
+                                            indexType = indexCfg.getIndexType();
+        if(indexType.contains(org.opends.server.admin.std.
+                meta.LocalDBIndexCfgDefn.IndexType.SUBSTRING)) {
+          hasSubIndex = true;
+        }
+      }
+      Importer importer = new Importer(importConfig, hasSubIndex);
       envConfig.setConfigParam("je.maxMemory", importer.getDBCacheSize());
       rootContainer = initializeRootContainer(envConfig);
       return importer.processImport(rootContainer);
diff --git a/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java b/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
index 4465487..8c9b3e2 100644
--- a/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
@@ -138,15 +138,20 @@
   //A thread threw an Runtime exception stop the import.
   private boolean unCaughtExceptionThrown = false;
 
+  //Set to true if substring indexes are defined.
+  private boolean hasSubIndexes = false;
+
   /**
    * Create a new import job with the specified ldif import config.
    *
    * @param ldifImportConfig The LDIF import config.
+   * @param hasSubIndexes <CODE>True</CODE> If substring indexes are defined.
    */
-  public Importer(LDIFImportConfig ldifImportConfig)
+  public Importer(LDIFImportConfig ldifImportConfig, boolean hasSubIndexes)
   {
     this.ldifImportConfig = ldifImportConfig;
     this.threads = new CopyOnWriteArrayList<WorkThread>();
+    this.hasSubIndexes = hasSubIndexes;
     calcMemoryLimits();
   }
 
@@ -172,12 +177,12 @@
     }
     // Create one set of worker threads/buffer managers for each base DN.
     for (DNContext context : importMap.values()) {
-      BufferManager bufferManager = new BufferManager(memoryPerContext,
-                                                      importThreadCount);
+      BufferManager bufferManager =
+                        new BufferManager(memoryPerContext, importThreadCount);
       context.setBufferManager(bufferManager);
       for (int i = 0; i < importThreadCount; i++) {
         WorkThread t = new WorkThread(context.getWorkQueue(), i,
-                                      bufferManager, rootContainer);
+                bufferManager, rootContainer);
         t.setUncaughtExceptionHandler(this);
         threads.add(t);
         t.start();
@@ -771,7 +776,12 @@
     long maxMemory = runtime.maxMemory();
     long totMemory = runtime.totalMemory();
     long totFreeMemory = (freeMemory + (maxMemory - totMemory));
-    long dbCacheLimit = (totFreeMemory * 40) / 100;
+    long dbCacheLimit = (totFreeMemory * 45) / 100;
+    //If there are now substring indexes defined, set the DB cache
+    //size to 60% and take a minimal substring buffer.
+    if(!hasSubIndexes) {
+      dbCacheLimit = (totFreeMemory * 60) / 100;
+    }
     dbCacheSizeStr = Long.toString(dbCacheLimit);
     totalAvailBufferMemory = (totFreeMemory * 10) / 100;
     if(totalAvailBufferMemory < (10 * minBuffer)) {
@@ -780,6 +790,8 @@
                                                       (10 * minBuffer));
       logError(msg);
       totalAvailBufferMemory = (10 * minBuffer);
+    } else if(!hasSubIndexes) {
+      totalAvailBufferMemory = (10 * minBuffer);
     }
     msg=NOTE_JEB_IMPORT_LDIF_MEMORY_INFO.get(dbCacheLimit,
                                              totalAvailBufferMemory);

--
Gitblit v1.10.0