From 6dbb06deae8b725845c16596360285ef251e1997 Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Fri, 20 Mar 2015 15:06:51 +0000
Subject: [PATCH] OPENDJ-1727 CR-6350 db-cache-percent default values in persistit backend probably too aggressive
---
opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 54 insertions(+), 4 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java
index 086e0d1..92ada67 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/persistit/PersistItStorage.java
@@ -30,6 +30,7 @@
import static org.opends.messages.ConfigMessages.*;
import static org.opends.messages.JebMessages.*;
+import static org.opends.messages.BackendMessages.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -62,6 +63,7 @@
import org.opends.server.backends.pluggable.spi.WriteOperation;
import org.opends.server.backends.pluggable.spi.WriteableStorage;
import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.MemoryQuota;
import org.opends.server.core.ServerContext;
import org.opends.server.extensions.DiskSpaceMonitor;
import org.opends.server.types.DN;
@@ -519,6 +521,7 @@
private Configuration dbCfg;
private PersistitBackendCfg config;
private DiskSpaceMonitor diskMonitor;
+ private MemoryQuota memQuota;
/**
* Creates a new persistit storage with the provided configuration.
@@ -541,13 +544,17 @@
BUFFER_SIZE, 4096, Long.MAX_VALUE / BUFFER_SIZE, 2048, true, false, false)));
final BufferPoolConfiguration bufferPoolCfg = getBufferPoolCfg();
bufferPoolCfg.setMaximumCount(Integer.MAX_VALUE);
+
+ memQuota = serverContext.getMemoryQuota();
if (cfg.getDBCacheSize() > 0)
{
bufferPoolCfg.setMaximumMemory(cfg.getDBCacheSize());
+ memQuota.acquireMemory(cfg.getDBCacheSize());
}
else
{
bufferPoolCfg.setFraction(cfg.getDBCachePercent() / 100.0f);
+ memQuota.acquireMemory(memQuota.memPercentToBytes(cfg.getDBCachePercent()));
}
dbCfg.setCommitPolicy(cfg.isDBTxnNoSync() ? SOFT : GROUP);
cfg.addPersistitChangeListener(this);
@@ -569,6 +576,14 @@
throw new IllegalStateException(e);
}
}
+ if (config.getDBCacheSize() > 0)
+ {
+ memQuota.releaseMemory(config.getDBCacheSize());
+ }
+ else
+ {
+ memQuota.releaseMemory(memQuota.memPercentToBytes(config.getDBCachePercent()));
+ }
config.removePersistitChangeListener(this);
DirectoryServer.deregisterMonitorProvider(diskMonitor);
DirectoryServer.deregisterAlertGenerator(this);
@@ -792,6 +807,41 @@
@Override
public boolean isConfigurationChangeAcceptable(PersistitBackendCfg cfg, List<LocalizableMessage> unacceptableReasons)
{
+ return checkConfigurationDirectories(cfg, unacceptableReasons);
+ }
+
+ /**
+ * Checks newly created backend has a valid configuration.
+ * @param cfg the new configuration
+ * @param unacceptableReasons the list of accumulated errors and their messages
+ * @param context TODO
+ * @return true if newly created backend has a valid configuration
+ */
+ public static boolean isConfigurationAcceptable(PersistitBackendCfg cfg, List<LocalizableMessage> unacceptableReasons,
+ ServerContext context)
+ {
+ if (context != null)
+ {
+ MemoryQuota memQuota = context.getMemoryQuota();
+ if (cfg.getDBCacheSize() > 0 && !memQuota.isMemoryAvailable(cfg.getDBCacheSize()))
+ {
+ unacceptableReasons.add(ERR_BACKEND_CONFIG_CACHE_SIZE_GREATER_THAN_JVM_HEAP.get(
+ cfg.getDBCacheSize(), memQuota.getAvailableMemory()));
+ return false;
+ }
+ else if (!memQuota.isMemoryAvailable(memQuota.memPercentToBytes(cfg.getDBCachePercent())))
+ {
+ unacceptableReasons.add(ERR_BACKEND_CONFIG_CACHE_PERCENT_GREATER_THAN_JVM_HEAP.get(
+ cfg.getDBCachePercent(), memQuota.memBytesToPercent(memQuota.getAvailableMemory())));
+ return false;
+ }
+ }
+ return checkConfigurationDirectories(cfg, unacceptableReasons);
+ }
+
+ private static boolean checkConfigurationDirectories(PersistitBackendCfg cfg,
+ List<LocalizableMessage> unacceptableReasons)
+ {
final ConfigChangeResult ccr = new ConfigChangeResult();
File parentDirectory = getFileForPath(cfg.getDBDirectory());
File newBackendDirectory = new File(parentDirectory, cfg.getBackendId());
@@ -813,7 +863,7 @@
* @param ccr the list of reasons to return upstream or null if called from setupStorage()
* @param cleanup true if the directory should be deleted after creation
*/
- private void checkDBDirExistsOrCanCreate(File backendDir, ConfigChangeResult ccr, boolean cleanup)
+ private static void checkDBDirExistsOrCanCreate(File backendDir, ConfigChangeResult ccr, boolean cleanup)
{
if (!backendDir.exists())
{
@@ -840,7 +890,7 @@
* @param ccr the current list of change results
* @throws forwards a file exception
*/
- private void checkDBDirPermissions(PersistitBackendCfg cfg, ConfigChangeResult ccr)
+ private static void checkDBDirPermissions(PersistitBackendCfg cfg, ConfigChangeResult ccr)
{
try
{
@@ -887,7 +937,7 @@
}
}
- private FilePermission decodeDBDirPermissions(PersistitBackendCfg curCfg) throws ConfigException
+ private static FilePermission decodeDBDirPermissions(PersistitBackendCfg curCfg) throws ConfigException
{
try
{
@@ -947,7 +997,7 @@
return ccr;
}
- private void addErrorMessage(final ConfigChangeResult ccr, LocalizableMessage message)
+ private static void addErrorMessage(final ConfigChangeResult ccr, LocalizableMessage message)
{
ccr.setResultCode(DirectoryServer.getServerErrorResultCode());
ccr.addMessage(message);
--
Gitblit v1.10.0