From 85abd3f90b47b3f324313e67dd768fc688a8c734 Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Fri, 24 Aug 2007 20:45:17 +0000
Subject: [PATCH] Added property to enable or disable fair ordering for the entry lock manager. By default, fair ordering will be used.

---
 opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java                |   23 +++++++++++++++++++----
 opendj-sdk/opends/src/server/org/opends/server/util/ServerConstants.java             |    7 +++++++
 opendj-sdk/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java |   26 +++++++++++++++++++++++++-
 3 files changed, 51 insertions(+), 5 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java b/opendj-sdk/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java
index ada5945..ac786c0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java
@@ -944,7 +944,31 @@
     }
   }
 
-
+  /**
+   * Retrieves whether a fair ordering should be used for the lock
+   * manager.
+   *
+   * @return True if fair orderin should be used or false otherwise
+   */
+  public boolean getLockManagerFairOrdering()
+  {
+    String sizeStr = getProperty(PROPERTY_LOCK_MANAGER_FAIR_ORDERING);
+    if (sizeStr == null)
+    {
+      return LockManager.DEFAULT_FAIR_ORDERING;
+    }
+    else
+    {
+      try
+      {
+        return Boolean.parseBoolean(sizeStr);
+      }
+      catch (Exception e)
+      {
+        return LockManager.DEFAULT_FAIR_ORDERING;
+      }
+    }
+  }
 
   /**
    * Retrieves the initial table size for the server lock table.  This
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
index b8d31ca..00de0a0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LockManager.java
@@ -61,6 +61,11 @@
   private static final DebugTracer TRACER = getTracer();
 
   /**
+   * The default setting for the use of fair ordering locks.
+   */
+  public static final boolean DEFAULT_FAIR_ORDERING = true;
+
+  /**
    * The default initial size to use for the lock table.
    */
   public static final int DEFAULT_INITIAL_TABLE_SIZE = 64;
@@ -93,6 +98,9 @@
   private static
        ConcurrentHashMap<DN,ReentrantReadWriteLock> lockTable;
 
+  // Whether fair ordering should be used on the locks.
+  private static boolean fair;
+
 
 
   // Initialize the lock table.
@@ -104,6 +112,7 @@
          environmentConfig.getLockManagerTableSize(),
          DEFAULT_LOAD_FACTOR,
          environmentConfig.getLockManagerConcurrencyLevel());
+    fair = environmentConfig.getLockManagerFairOrdering();
   }
 
 
@@ -158,6 +167,8 @@
 
       oldTable.clear();
     }
+
+    fair = environmentConfig.getLockManagerFairOrdering();
   }
 
 
@@ -175,7 +186,8 @@
    */
   public static Lock tryLockRead(DN entryDN)
   {
-    ReentrantReadWriteLock entryLock = new ReentrantReadWriteLock();
+    ReentrantReadWriteLock entryLock =
+        new ReentrantReadWriteLock(fair);
     Lock readLock = entryLock.readLock();
     readLock.lock();
 
@@ -296,7 +308,8 @@
       return readLock;
     }
 
-    ReentrantReadWriteLock entryLock = new ReentrantReadWriteLock();
+    ReentrantReadWriteLock entryLock =
+        new ReentrantReadWriteLock(fair);
     readLock = entryLock.readLock();
     readLock.lock();
 
@@ -387,7 +400,8 @@
    */
   public static Lock tryLockWrite(DN entryDN)
   {
-    ReentrantReadWriteLock entryLock = new ReentrantReadWriteLock();
+    ReentrantReadWriteLock entryLock =
+        new ReentrantReadWriteLock(fair);
     Lock writeLock = entryLock.writeLock();
     writeLock.lock();
 
@@ -505,7 +519,8 @@
       return writeLock;
     }
 
-    ReentrantReadWriteLock entryLock = new ReentrantReadWriteLock();
+    ReentrantReadWriteLock entryLock =
+        new ReentrantReadWriteLock(fair);
     writeLock = entryLock.writeLock();
     writeLock.lock();
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/util/ServerConstants.java b/opendj-sdk/opends/src/server/org/opends/server/util/ServerConstants.java
index 080dc21..0e2a5ed 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/util/ServerConstants.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/util/ServerConstants.java
@@ -2580,6 +2580,13 @@
   public static final String PROPERTY_ERROR_LEVEL =
       "org.opends.server.error.level";
 
+  /**
+   * The name of the system property that can be used to specify if  the entry
+   * lock manager should use a fair ordering policy.
+   */
+  public static final String PROPERTY_LOCK_MANAGER_FAIR_ORDERING =
+       "org.opends.server.LockManagerFairOrdering";
+
 
 
   /**

--
Gitblit v1.10.0