From 5537354c0a5bd0a9db2dce6cd207962fdc3280eb Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Mon, 09 Mar 2009 18:04:05 +0000
Subject: [PATCH] Fix issue 3832 - Provide ergonomics style settings for common server properties
---
opendj-sdk/opends/src/messages/messages/backend.properties | 6 +++
opendj-sdk/opends/src/messages/messages/core.properties | 3 +
opendj-sdk/opends/resource/config/config.ldif | 3 -
opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java | 33 ++++++++++++----
opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/TraditionalWorkQueueConfiguration.xml | 11 ++++-
opendj-sdk/opends/resource/schema/02-config.ldif | 4 +-
opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml | 18 +++++---
opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java | 35 +++++++++++++++++
8 files changed, 89 insertions(+), 24 deletions(-)
diff --git a/opendj-sdk/opends/resource/config/config.ldif b/opendj-sdk/opends/resource/config/config.ldif
index 91ee892..78f152f 100644
--- a/opendj-sdk/opends/resource/config/config.ldif
+++ b/opendj-sdk/opends/resource/config/config.ldif
@@ -189,7 +189,6 @@
ds-cfg-db-txn-no-sync: false
ds-cfg-db-txn-write-no-sync: true
ds-cfg-db-run-cleaner: true
-ds-cfg-db-num-cleaner-threads: 1
ds-cfg-db-cleaner-min-utilization: 75
ds-cfg-db-evictor-lru-only: true
ds-cfg-db-evictor-nodes-per-scan: 10
@@ -198,7 +197,6 @@
ds-cfg-db-logging-level: CONFIG
ds-cfg-db-checkpointer-bytes-interval: 20 megabytes
ds-cfg-db-checkpointer-wakeup-interval: 30 seconds
-ds-cfg-db-num-lock-tables: 19
dn: cn=Index,ds-cfg-backend-id=userRoot,cn=Backends,cn=config
objectClass: top
@@ -2423,7 +2421,6 @@
objectClass: ds-cfg-traditional-work-queue
cn: Work Queue
ds-cfg-java-class: org.opends.server.extensions.TraditionalWorkQueue
-ds-cfg-num-worker-threads: 24
ds-cfg-max-work-queue-capacity: 0
dn: cn=Administration Connector,cn=config
diff --git a/opendj-sdk/opends/resource/schema/02-config.ldif b/opendj-sdk/opends/resource/schema/02-config.ldif
index 5bc49bb..995d137 100644
--- a/opendj-sdk/opends/resource/schema/02-config.ldif
+++ b/opendj-sdk/opends/resource/schema/02-config.ldif
@@ -3140,8 +3140,8 @@
NAME 'ds-cfg-traditional-work-queue'
SUP ds-cfg-work-queue
STRUCTURAL
- MUST ds-cfg-num-worker-threads
- MAY ds-cfg-max-work-queue-capacity
+ MAY ( ds-cfg-num-worker-threads $
+ ds-cfg-max-work-queue-capacity )
X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.73
NAME 'ds-cfg-password-modify-extended-operation-handler'
diff --git a/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml b/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml
index 957ebc0..0894421 100644
--- a/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml
+++ b/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml
@@ -23,7 +23,7 @@
! CDDL HEADER END
!
!
- ! Copyright 2007-2008 Sun Microsystems, Inc.
+ ! Copyright 2007-2009 Sun Microsystems, Inc.
! -->
<adm:managed-object name="local-db-backend"
plural-name="local-db-backends" package="org.opends.server.admin.std"
@@ -696,9 +696,11 @@
<adm:component-restart />
</adm:requires-admin-action>
<adm:default-behavior>
- <adm:defined>
- <adm:value>19</adm:value>
- </adm:defined>
+ <adm:alias>
+ <adm:synopsis>
+ Let the server decide.
+ </adm:synopsis>
+ </adm:alias>
</adm:default-behavior>
<adm:syntax>
<adm:integer lower-limit="1" upper-limit="32767" />
@@ -719,9 +721,11 @@
threads may be required to maintain the desired utilization.
</adm:description>
<adm:default-behavior>
- <adm:defined>
- <adm:value>1</adm:value>
- </adm:defined>
+ <adm:alias>
+ <adm:synopsis>
+ Let the server decide.
+ </adm:synopsis>
+ </adm:alias>
</adm:default-behavior>
<adm:syntax>
<adm:integer lower-limit="1" />
diff --git a/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/TraditionalWorkQueueConfiguration.xml b/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/TraditionalWorkQueueConfiguration.xml
index 745c99f..3b71f66 100644
--- a/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/TraditionalWorkQueueConfiguration.xml
+++ b/opendj-sdk/opends/src/admin/defn/org/opends/server/admin/std/TraditionalWorkQueueConfiguration.xml
@@ -23,7 +23,7 @@
! CDDL HEADER END
!
!
- ! Copyright 2007-2008 Sun Microsystems, Inc.
+ ! Copyright 2007-2009 Sun Microsystems, Inc.
! -->
<adm:managed-object name="traditional-work-queue"
plural-name="traditional-work-queues" extends="work-queue"
@@ -61,7 +61,7 @@
</adm:defined>
</adm:default-behavior>
</adm:property-override>
- <adm:property name="num-worker-threads" mandatory="true">
+ <adm:property name="num-worker-threads">
<adm:synopsis>
Specifies the number of worker threads to be used for processing
operations placed in the queue.
@@ -72,6 +72,13 @@
value is reduced, the appropriate number of threads are destroyed
as operations complete processing.
</adm:description>
+ <adm:default-behavior>
+ <adm:alias>
+ <adm:synopsis>
+ Let the server decide.
+ </adm:synopsis>
+ </adm:alias>
+ </adm:default-behavior>
<adm:syntax>
<adm:integer lower-limit="1" upper-limit="2147483647" />
</adm:syntax>
diff --git a/opendj-sdk/opends/src/messages/messages/backend.properties b/opendj-sdk/opends/src/messages/messages/backend.properties
index 5f365cc..0344673 100644
--- a/opendj-sdk/opends/src/messages/messages/backend.properties
+++ b/opendj-sdk/opends/src/messages/messages/backend.properties
@@ -1136,3 +1136,9 @@
MILD_ERR_SCHEMA_MODIFY_RULEID_CONFLICTS_FOR_ADD_DSR_409=Unable to add DIT \
structure rule %s because its rule identifier conflicts with existing DIT structure \
rule (%s)
+INFO_ERGONOMIC_SIZING_OF_JE_CLEANER_THREADS_410=Local DB backend %s does not \
+specify the number of cleaner threads: defaulting to %d threads
+INFO_ERGONOMIC_SIZING_OF_JE_LOCK_TABLES_411=Local DB backend %s does not \
+specify the number of lock tables: defaulting to %d
+
+
diff --git a/opendj-sdk/opends/src/messages/messages/core.properties b/opendj-sdk/opends/src/messages/messages/core.properties
index 40448eb..8ebaf58 100644
--- a/opendj-sdk/opends/src/messages/messages/core.properties
+++ b/opendj-sdk/opends/src/messages/messages/core.properties
@@ -1816,4 +1816,5 @@
SEVERE_ERR_WORKFLOW_BASE_DN_DUPLICATED_IN_NG_719=\
Unable to register the workflow because the base DN '%s' is already \
registered with the network group '%s'
-
+INFO_ERGONOMIC_SIZING_OF_WORKER_THREAD_POOL_720=No worker queue thread \
+pool size specified: sizing automatically to use %d threads
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java
index 7794840..9987ab2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2009 Sun Microsystems, Inc.
*/
package org.opends.server.backends.jeb;
@@ -35,6 +35,7 @@
import java.util.HashMap;
import java.util.Map;
import java.lang.reflect.Method;
+import java.math.BigInteger;
import java.util.HashSet;
import java.util.SortedSet;
import java.util.StringTokenizer;
@@ -50,8 +51,10 @@
import org.opends.server.admin.BooleanPropertyDefinition;
import org.opends.server.admin.PropertyDefinition;
+import static org.opends.server.loggers.ErrorLogger.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.messages.ConfigMessages.*;
+import static org.opends.messages.BackendMessages.*;
/**
* This class maps JE properties to configuration attributes.
@@ -306,6 +309,36 @@
else
{
Object value = method.invoke(cfg);
+
+ if (attrName.equals(ATTR_NUM_CLEANER_THREADS) && value == null)
+ {
+ // Automatically choose based on the number of processors.
+ int cpus = Runtime.getRuntime().availableProcessors();
+ value = Integer.valueOf(Math.max(2, cpus / 2));
+
+ Message message =
+ INFO_ERGONOMIC_SIZING_OF_JE_CLEANER_THREADS.get(String
+ .valueOf(cfg.dn()), (Number) value);
+ logError(message);
+ }
+ else if (attrName.equals(ATTR_NUM_LOCK_TABLES)
+ && value == null)
+ {
+ // Automatically choose based on the number of processors.
+ // We'll assume that the user has also allowed automatic
+ // configuration of cleaners and workers.
+ int cpus = Runtime.getRuntime().availableProcessors();
+ int cleaners = Math.max(2, cpus / 2);
+ int workers = Math.max(24, cpus * 2);
+ BigInteger tmp = BigInteger.valueOf((cleaners + workers) * 2);
+ value = tmp.nextProbablePrime();
+
+ Message message =
+ INFO_ERGONOMIC_SIZING_OF_JE_LOCK_TABLES.get(String
+ .valueOf(cfg.dn()), (Number) value);
+ logError(message);
+ }
+
return String.valueOf(value);
}
}
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
index a007102..30058c6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2009 Sun Microsystems, Inc.
*/
package org.opends.server.extensions;
@@ -49,7 +49,6 @@
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
-import org.opends.server.types.DN;
import org.opends.server.types.InitializationException;
import org.opends.server.types.Operation;
import org.opends.server.types.ResultCode;
@@ -103,10 +102,6 @@
// Indicates whether the Directory Server is shutting down.
private boolean shutdownRequested;
- // The DN of the configuration entry with information to use to configure the
- // work queue.
- private DN configEntryDN;
-
// The thread number used for the last worker thread that was created.
private int lastThreadNumber;
@@ -156,8 +151,7 @@
// Get the necessary configuration from the provided entry.
- configEntryDN = configuration.dn();
- numWorkerThreads = configuration.getNumWorkerThreads();
+ numWorkerThreads = getNumWorkerThreads(configuration);
maxCapacity = configuration.getMaxWorkQueueCapacity();
@@ -292,6 +286,7 @@
* down or the pending operation queue is already
* at its maximum capacity).
*/
+ @Override
public void submitOperation(AbstractOperation operation)
throws DirectoryException
{
@@ -712,5 +707,27 @@
return true;
}
}
+
+
+
+ // Determine the number of worker threads.
+ private int getNumWorkerThreads(TraditionalWorkQueueCfg configuration)
+ {
+ if (configuration.getNumWorkerThreads() == null)
+ {
+ // Automatically choose based on the number of processors.
+ int cpus = Runtime.getRuntime().availableProcessors();
+ int value = Math.max(24, cpus * 2);
+
+ Message message = INFO_ERGONOMIC_SIZING_OF_WORKER_THREAD_POOL.get(value);
+ logError(message);
+
+ return value;
+ }
+ else
+ {
+ return configuration.getNumWorkerThreads();
+ }
+ }
}
--
Gitblit v1.10.0