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