From bf7e97e3cb610d18d4fbe62e614cdb55c2d24930 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 17 Sep 2010 22:16:30 +0000
Subject: [PATCH] Fix potential deadlock which may occur while performing simultaneous large searches and modify operations on the same connection. Use single channel lock per connection and share it across thread local ASN1 writers.
---
opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java b/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
index d1c1b50..9e8809c 100644
--- a/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
+++ b/opends/src/server/org/opends/server/protocols/ldap/LDAPClientConnection.java
@@ -51,6 +51,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
@@ -362,6 +363,7 @@
private final RedirectingByteChannel saslChannel;
private final RedirectingByteChannel tlsChannel;
+ private final ReentrantLock writeLock;
private volatile ConnectionSecurityProvider activeProvider = null;
private volatile ConnectionSecurityProvider tlsPendingProvider = null;
private volatile ConnectionSecurityProvider saslPendingProvider = null;
@@ -427,6 +429,7 @@
this.asn1Reader =
ASN1.getReader(saslChannel, APPLICATION_BUFFER_SIZE, connectionHandler
.getMaxRequestSize());
+ writeLock = new ReentrantLock();
asn1WriterMap = new ConcurrentHashMap<Thread,ASN1Writer>();
@@ -933,11 +936,11 @@
if (isSecure())
{
int appBufSize = activeProvider.getAppBufSize();
- asn1Writer = ASN1.getWriter(saslChannel, appBufSize);
+ asn1Writer = ASN1.getWriter(saslChannel, writeLock, appBufSize);
}
else
{
- asn1Writer = ASN1.getWriter(saslChannel,
+ asn1Writer = ASN1.getWriter(saslChannel, writeLock,
APPLICATION_BUFFER_SIZE);
}
asn1WriterMap.put(currentThread, asn1Writer);
--
Gitblit v1.10.0