From 0db1e3229238b97a675ff47cdbe3aad170241dd7 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 23 Dec 2014 12:44:43 +0000
Subject: [PATCH] OPENDJ-1713: Persistit: dsconfig configuration properties have no effect

---
 opendj-sdk/opendj3-server-dev/src/admin/defn/org/opends/server/admin/std/PersistitBackendConfiguration.xml |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java        |   65 +++++++++++++++++++++++---------
 opendj-sdk/opendj3-server-dev/src/messages/messages/jeb.properties                                         |    2 +
 3 files changed, 50 insertions(+), 19 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/admin/defn/org/opends/server/admin/std/PersistitBackendConfiguration.xml b/opendj-sdk/opendj3-server-dev/src/admin/defn/org/opends/server/admin/std/PersistitBackendConfiguration.xml
index 1a5a8ca..50035f8 100644
--- a/opendj-sdk/opendj3-server-dev/src/admin/defn/org/opends/server/admin/std/PersistitBackendConfiguration.xml
+++ b/opendj-sdk/opendj3-server-dev/src/admin/defn/org/opends/server/admin/std/PersistitBackendConfiguration.xml
@@ -185,7 +185,7 @@
     </adm:description>
     <adm:default-behavior>
       <adm:defined>
-        <adm:value>false</adm:value>
+        <adm:value>true</adm:value>
       </adm:defined>
     </adm:default-behavior>
     <adm:syntax>
diff --git a/opendj-sdk/opendj3-server-dev/src/messages/messages/jeb.properties b/opendj-sdk/opendj3-server-dev/src/messages/messages/jeb.properties
index ea083b8..e1a891b 100644
--- a/opendj-sdk/opendj3-server-dev/src/messages/messages/jeb.properties
+++ b/opendj-sdk/opendj3-server-dev/src/messages/messages/jeb.properties
@@ -399,3 +399,5 @@
 NOTE_JEB_REBUILD_CLEARDEGRADEDSTATE_FINAL_STATUS_232=Degraded state of \
 index(es) %s has been cleared
 ERR_PARENT_ENTRY_IS_MISSING_233=Parent entry is missing
+NOTE_PERSISTIT_MEMORY_CFG_234=The Persistit storage for backend '%s' initialized \
+ to use %d buffers of %d bytes (total %dkb)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
index a1b7452..9d42dd6 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
@@ -25,13 +25,17 @@
  */
 package org.opends.server.backends.persistit;
 
-import static org.opends.server.util.StaticUtils.*;
+import static com.persistit.Transaction.CommitPolicy.GROUP;
+import static com.persistit.Transaction.CommitPolicy.SOFT;
+import static java.util.Arrays.asList;
+import static org.opends.messages.JebMessages.NOTE_PERSISTIT_MEMORY_CFG;
+import static org.opends.server.util.StaticUtils.getFileForPath;
 
 import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Properties;
 
+import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.admin.std.server.PersistitBackendCfg;
@@ -45,6 +49,8 @@
 import org.opends.server.backends.pluggable.spi.WriteOperation;
 import org.opends.server.backends.pluggable.spi.WriteableStorage;
 
+import com.persistit.Configuration;
+import com.persistit.Configuration.BufferPoolConfiguration;
 import com.persistit.Exchange;
 import com.persistit.Key;
 import com.persistit.Persistit;
@@ -53,12 +59,17 @@
 import com.persistit.TreeBuilder;
 import com.persistit.Value;
 import com.persistit.Volume;
+import com.persistit.VolumeSpecification;
 import com.persistit.exception.PersistitException;
 import com.persistit.exception.RollbackException;
 
 @SuppressWarnings("javadoc")
 public final class PersistItStorage implements Storage
 {
+  private static final String VOLUME_NAME = "dj";
+  /** The buffer / page size used by the PersistIt storage. */
+  private static final int BUFFER_SIZE = 16 * 1024;
+
   private final class CursorImpl implements Cursor
   {
     private ByteString currentKey;
@@ -466,11 +477,12 @@
     }
   }
 
+  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
   private File backendDirectory;
-  private PersistitBackendCfg config;
   private Persistit db;
-  private Properties properties;
   private Volume volume;
+  private Configuration dbCfg;
+  private PersistitBackendCfg config;
 
   @Override
   public void close()
@@ -498,19 +510,30 @@
   @Override
   public void initialize(final PersistitBackendCfg cfg)
   {
-    this.config = cfg;
-    this.backendDirectory = new File(getFileForPath(config.getDBDirectory()),
-        config.getBackendId());
+    backendDirectory = new File(getFileForPath(cfg.getDBDirectory()), cfg.getBackendId());
+    config = cfg;
+    dbCfg = new Configuration();
+    dbCfg.setLogFile(new File(backendDirectory, VOLUME_NAME + ".log").getPath());
+    dbCfg.setJournalPath(new File(backendDirectory, VOLUME_NAME + "_journal").getPath());
+    dbCfg.setVolumeList(asList(new VolumeSpecification(new File(
+        backendDirectory, VOLUME_NAME).getPath(), null, BUFFER_SIZE, 4096,
+        Long.MAX_VALUE / BUFFER_SIZE, 2048, true, false, false)));
+    final BufferPoolConfiguration bufferPoolCfg = getBufferPoolCfg();
+    bufferPoolCfg.setMaximumCount(Integer.MAX_VALUE);
+    if (cfg.getDBCacheSize() > 0l)
+    {
+      bufferPoolCfg.setMaximumMemory(cfg.getDBCacheSize());
+    }
+    else
+    {
+      bufferPoolCfg.setFraction(cfg.getDBCachePercent() / 100.0f);
+    }
+    dbCfg.setCommitPolicy(cfg.isDBTxnNoSync() ? SOFT : GROUP);
+  }
 
-    properties = new Properties();
-    properties.setProperty("datapath", backendDirectory.toString());
-    properties.setProperty("logpath", backendDirectory.toString());
-    properties.setProperty("logfile", "${logpath}/dj_${timestamp}.log");
-    properties.setProperty("buffer.count.16384", "64K");
-    properties.setProperty("journalpath", "${datapath}/dj_journal");
-    properties.setProperty("volume.1", "${datapath}/dj"
-        + ",create,pageSize:16K" + ",initialSize:50M" + ",extensionSize:1M"
-        + ",maximumSize:10G");
+  private BufferPoolConfiguration getBufferPoolCfg()
+  {
+    return dbCfg.getBufferPoolMap().get(BUFFER_SIZE);
   }
 
   @Override
@@ -524,9 +547,15 @@
   {
     try
     {
-      db = new Persistit(properties);
+      db = new Persistit(dbCfg);
+
+      final long bufferCount = getBufferPoolCfg().computeBufferCount(db.getAvailableHeap());
+      final long totalSize = bufferCount * BUFFER_SIZE / 1024;
+      logger.info(NOTE_PERSISTIT_MEMORY_CFG, config.getBackendId(),
+          bufferCount, BUFFER_SIZE, totalSize);
+
       db.initialize();
-      volume = db.loadVolume("dj");
+      volume = db.loadVolume(VOLUME_NAME);
     }
     catch (final PersistitException e)
     {

--
Gitblit v1.10.0