From 86ad6a08499797f9b3204896caee947abb03394f Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Mon, 07 Nov 2016 13:59:40 +0000
Subject: [PATCH] OPENDJ-3179: Migrate LDAP Connection Handler to SDK Grizzly transport

---
 opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyUtils.java |   19 ++++++++++++-------
 1 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyUtils.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyUtils.java
index 0cd00f2..4ec6f9e 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyUtils.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/GrizzlyUtils.java
@@ -47,6 +47,9 @@
     @SuppressWarnings("rawtypes")
     private static final ThreadCache.CachedTypeIndex<LDAPWriter> WRITER_INDEX = ThreadCache
             .obtainIndex(LDAPWriter.class, 1);
+    @SuppressWarnings("rawtypes")
+    private static final ThreadCache.CachedTypeIndex<LDAPWriter> WRITER_INDEX_V2 = ThreadCache
+            .obtainIndex(LDAPWriter.class.getName() + ".ldapV2", LDAPWriter.class, 1);
 
     /**
      * Build a filter chain from the provided processor if possible and the
@@ -118,11 +121,11 @@
      */
     static FilterChain addFilterToChain(final Filter filter, final FilterChain chain) {
         // By default, before LDAP filter which is the last one
-        if (filter instanceof SSLFilter) {
+        if (filter instanceof SSLFilter || filter instanceof StartTLSFilter) {
             return FilterChainBuilder.stateless().addAll(chain).add(1, filter).build();
         }
         if (filter instanceof SaslFilter) {
-            final int pos = chain.get(1) instanceof SSLFilter ? 2 : 1;
+            final int pos = (chain.get(1) instanceof SSLFilter || chain.get(1) instanceof StartTLSFilter) ? 2 : 1;
             return FilterChainBuilder.stateless().addAll(chain).add(pos, filter).build();
         }
         return FilterChainBuilder.stateless().addAll(chain).add(chain.size() - 1, filter).build();
@@ -157,10 +160,12 @@
      * @return a LDAP writer
      */
     @SuppressWarnings("unchecked")
-    static LDAPWriter<ASN1BufferWriter> getWriter(final MemoryManager memoryManager) {
-        LDAPWriter<ASN1BufferWriter> writer = ThreadCache.takeFromCache(WRITER_INDEX);
+    static LDAPWriter<ASN1BufferWriter> getWriter(final MemoryManager memoryManager, final int protocolVersion) {
+        LDAPWriter<ASN1BufferWriter> writer = protocolVersion >= 3
+                ? ThreadCache.takeFromCache(WRITER_INDEX)
+                : ThreadCache.takeFromCache(WRITER_INDEX_V2);
         if (writer == null) {
-            writer = LDAP.getWriter(new ASN1BufferWriter(memoryManager));
+            writer = LDAP.getWriter(new ASN1BufferWriter(memoryManager), protocolVersion);
         }
         writer.getASN1Writer().reset();
         return writer;
@@ -176,7 +181,7 @@
      */
     static void recycleWriter(LDAPWriter<ASN1BufferWriter> writer) {
         writer.getASN1Writer().recycle();
-        ThreadCache.putToCache(WRITER_INDEX, writer);
+        ThreadCache.putToCache(writer.getProtocolVersion() >= 3 ? WRITER_INDEX : WRITER_INDEX_V2, writer);
     }
 
     static void configureConnection(final Connection<?> connection, final LocalizedLogger logger, Options options) {
@@ -184,7 +189,7 @@
          * Test shows that its much faster with non block writes but risk
          * running out of memory if the server is slow.
          */
-        connection.configureBlocking(true);
+        connection.configureBlocking(false);
 
         // Configure socket options.
         final SocketChannel channel = (SocketChannel) ((TCPNIOConnection) connection).getChannel();

--
Gitblit v1.10.0