From 3e1db08dce649f6d426aae67d506c8c23b15f6e8 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 18 Sep 2013 16:05:59 +0000
Subject: [PATCH] Fix OPENDJ-1058 – HeartbeatConnectionFactory does not actively shutdown dead connections

---
 opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java
index 7f84a81..edb811a 100644
--- a/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java
+++ b/opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java
@@ -970,6 +970,9 @@
                 Math.max(configuration.get("connectionPoolSize").defaultTo(10).asInteger(), 1);
         final int heartBeatIntervalSeconds =
                 Math.max(configuration.get("heartBeatIntervalSeconds").defaultTo(30).asInteger(), 1);
+        final int heartBeatTimeoutMilliSeconds =
+                Math.max(configuration.get("heartBeatTimeoutMilliSeconds").defaultTo(500)
+                        .asInteger(), 100);
 
         // Parse authentication parameters.
         final BindRequest bindRequest;
@@ -1036,7 +1039,7 @@
         }
         final ConnectionFactory primary =
                 parseLDAPServers(primaryLDAPServers, bindRequest, connectionPoolSize,
-                        heartBeatIntervalSeconds, options);
+                        heartBeatIntervalSeconds, heartBeatTimeoutMilliSeconds, options);
 
         // Parse secondary data center(s).
         final JsonValue secondaryLDAPServers = configuration.get("secondaryLDAPServers");
@@ -1045,7 +1048,7 @@
             if (secondaryLDAPServers.size() > 0) {
                 secondary =
                         parseLDAPServers(secondaryLDAPServers, bindRequest, connectionPoolSize,
-                                heartBeatIntervalSeconds, options);
+                                heartBeatIntervalSeconds, heartBeatTimeoutMilliSeconds, options);
             } else {
                 secondary = null;
             }
@@ -1093,20 +1096,22 @@
 
     private static ConnectionFactory parseLDAPServers(final JsonValue config,
             final BindRequest bindRequest, final int connectionPoolSize,
-            final int heartBeatIntervalSeconds, final LDAPOptions options) {
+            final int heartBeatIntervalSeconds, final int heartBeatTimeoutMilliSeconds,
+            final LDAPOptions options) {
         final List<ConnectionFactory> servers = new ArrayList<ConnectionFactory>(config.size());
         for (final JsonValue server : config) {
             final String host = server.get("hostname").required().asString();
             final int port = server.get("port").required().asInteger();
             ConnectionFactory factory = new LDAPConnectionFactory(host, port, options);
+            factory =
+                    Connections.newHeartBeatConnectionFactory(factory,
+                            heartBeatIntervalSeconds * 1000, heartBeatTimeoutMilliSeconds,
+                            TimeUnit.MILLISECONDS);
             if (bindRequest != null) {
                 factory = Connections.newAuthenticatedConnectionFactory(factory, bindRequest);
             }
             if (connectionPoolSize > 1) {
                 factory =
-                        Connections.newHeartBeatConnectionFactory(factory,
-                                heartBeatIntervalSeconds, TimeUnit.SECONDS);
-                factory =
                         Connections.newCachedConnectionPool(factory, 0, connectionPoolSize, 60L,
                                 TimeUnit.SECONDS);
             }

--
Gitblit v1.10.0