From 85472c61f9f6aa066bfbe348ded1c5dd50af012e Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Thu, 14 Feb 2008 16:51:41 +0000
Subject: [PATCH] Fix issue 2953: ConcurrentModificationException in IdleTimeLimitThread.

---
 opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java |   24 ++++++++++++++++++++----
 1 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java b/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
index 5592cb7..e1a7fd9 100644
--- a/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
+++ b/opends/src/server/org/opends/server/protocols/ldap/LDAPRequestHandler.java
@@ -98,6 +98,9 @@
   // The name to use for this request handler.
   private String handlerName;
 
+  // Lock for preventing concurrent updates to the select keys.
+  private final Object selectorKeyLock = new Object();
+
 
 
   /**
@@ -303,7 +306,9 @@
         {
           SocketChannel socketChannel = c.getSocketChannel();
           socketChannel.configureBlocking(false);
-          socketChannel.register(selector, SelectionKey.OP_READ, c);
+          synchronized (selectorKeyLock) {
+            socketChannel.register(selector, SelectionKey.OP_READ, c);
+          }
         }
         catch (Exception e)
         {
@@ -374,7 +379,11 @@
    */
   public void deregisterClient(LDAPClientConnection clientConnection)
   {
-    SelectionKey[] keyArray = selector.keys().toArray(new SelectionKey[0]);
+    SelectionKey[] keyArray;
+    synchronized (selectorKeyLock) {
+      keyArray = selector.keys().toArray(new SelectionKey[0]);
+    }
+
     for (SelectionKey key : keyArray)
     {
       LDAPClientConnection conn = (LDAPClientConnection) key.attachment();
@@ -414,7 +423,11 @@
    */
   public void deregisterAllClients()
   {
-    SelectionKey[] keyArray = selector.keys().toArray(new SelectionKey[0]);
+    SelectionKey[] keyArray;
+    synchronized (selectorKeyLock) {
+      keyArray = selector.keys().toArray(new SelectionKey[0]);
+    }
+
     for (SelectionKey key : keyArray)
     {
       try
@@ -454,7 +467,10 @@
    */
   public Collection<LDAPClientConnection> getClientConnections()
   {
-    SelectionKey[] keyArray = selector.keys().toArray(new SelectionKey[0]);
+    SelectionKey[] keyArray;
+    synchronized (selectorKeyLock) {
+      keyArray = selector.keys().toArray(new SelectionKey[0]);
+    }
 
     ArrayList<LDAPClientConnection> connList =
          new ArrayList<LDAPClientConnection>(keyArray.length);

--
Gitblit v1.10.0