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