From d2db6915a220002a55281ebeb94fc8c590a33853 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 14 Apr 2011 16:45:52 +0000
Subject: [PATCH] Another fix for issue OpenDJ-95: Socket leak and constant disconnect/reconnect when a directory server can no longer reach its connected replication server

---
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java |   32 +++++++++++++++++++++-----------
 1 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 38535e6..34f5bd1 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -514,28 +514,38 @@
       TRACER.debugInfo("RS " + this.getMonitorInstanceName() +
                " connects to " + remoteServerURL);
 
+    Socket socket = new Socket();
+    ProtocolSession session = null;
     try
     {
       InetSocketAddress ServerAddr = new InetSocketAddress(
-                     InetAddress.getByName(hostname), Integer.parseInt(port));
-      Socket socket = new Socket();
+          InetAddress.getByName(hostname), Integer.parseInt(port));
       socket.setTcpNoDelay(true);
       socket.connect(ServerAddr, 500);
 
+      session = replSessionSecurity.createClientSession(socket,
+          ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+
       ReplicationServerHandler handler = new ReplicationServerHandler(
-          replSessionSecurity.createClientSession(
-              socket,
-              ReplSessionSecurity.HANDSHAKE_TIMEOUT),
-              queueSize,
-              this.serverURL,
-              serverId,
-              this,
-              rcvWindow);
+          session, queueSize, this.serverURL, serverId, this,
+          rcvWindow);
       handler.connect(baseDn, sslEncryption);
     }
     catch (Exception e)
     {
-      // ignore
+      if (session != null)
+      {
+        session.close();
+      }
+
+      try
+      {
+        socket.close();
+      }
+      catch (IOException ignored)
+      {
+        // Ignore.
+      }
     }
 
   }

--
Gitblit v1.10.0