From 08f9243b55eb5f0f8030eebe976a0d85ffbd44c2 Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Fri, 30 Jul 2010 15:11:25 +0000
Subject: [PATCH] Implements a configurable limit in the number of persistent searches a server can handle.
---
opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java | 41 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java b/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
index f7237e7..76e50f8 100644
--- a/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
+++ b/opends/src/server/org/opends/server/extensions/TraditionalWorkQueue.java
@@ -113,6 +113,9 @@
// a configuration change has not been completely applied).
private int numWorkerThreads;
+ //The maximum number of concurrent persistent searches.
+ private int maxPSearches;
+
// The queue that will be used to actually hold the pending operations.
private LinkedBlockingQueue<AbstractOperation> opQueue;
@@ -152,6 +155,17 @@
// Get the necessary configuration from the provided entry.
numWorkerThreads = getNumWorkerThreads(configuration);
+ //Check the value of the maximum persistent searches attribute.
+ //We don't allow a value greater than the number of threads.
+ maxPSearches = configuration.getMaxPsearches()==null?
+ numWorkerThreads:configuration.getMaxPsearches();
+ if(maxPSearches > numWorkerThreads)
+ {
+ Message message = ERR_CONFIG_CORE_INVALID_MAX_PSEARCH_LIMIT.get(
+ maxPSearches, numWorkerThreads, numWorkerThreads);
+ throw new ConfigException(message);
+ }
+
maxCapacity = configuration.getMaxWorkQueueCapacity();
@@ -551,7 +565,19 @@
TraditionalWorkQueueCfg configuration,
List<Message> unacceptableReasons)
{
- // The provided configuration will always be acceptable.
+ //Check if the max persistent search value is under limit.
+ if(configuration.getMaxPsearches() !=null)
+ {
+ int nPSearches = configuration.getMaxPsearches();
+ int nWorkerThreads = getNumWorkerThreads(configuration);
+ if(nPSearches > nWorkerThreads)
+ {
+ Message message = ERR_CONFIG_CORE_INVALID_MAX_PSEARCH_LIMIT.get(
+ nPSearches, nWorkerThreads, nWorkerThreads);
+ unacceptableReasons.add(message);
+ return false;
+ }
+ }
return true;
}
@@ -607,6 +633,10 @@
}
+ //Get the new maximum psearch value.
+ maxPSearches = configuration.getMaxPsearches()==null?
+ numWorkerThreads:configuration.getMaxPsearches();
+
// Apply a change to the maximum capacity if appropriate. Since we can't
// change capacity on the fly, then we'll have to create a new queue and
// transfer any remaining items into it. Any thread that is waiting on the
@@ -708,6 +738,15 @@
}
+ /**
+ * {@inheritDoc}
+ */
+ public int getMaxPersistentSearchLimit()
+ {
+ return maxPSearches;
+ }
+
+
// Determine the number of worker threads.
private int getNumWorkerThreads(TraditionalWorkQueueCfg configuration)
--
Gitblit v1.10.0